Postgres Запрос занимает много времени - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть запрос SQL, выполнение которого занимает много времени (~ 12 с):

select nextval('rec_id_seq_af') as rec_id,ds_id,ds_dt_id,
inv_vcf_id,inv_sample_id,inv_variant_id,ds_dt_line_seq from rs_data_1_af 
group by ds_id,ds_dt_id,inv_vcf_id,inv_sample_id,inv_variant_id,ds_dt_line_seq 
order by ds_id,ds_dt_id,inv_vcf_id,inv_sample_id,inv_variant_id,ds_dt_line_seq;

Когда я запускаю:

EXPLAIN (ANALYZE, BUFFERS)
select nextval('rec_id_seq_af') as rec_id,ds_id,ds_dt_id,
inv_vcf_id,inv_sample_id,inv_variant_id,ds_dt_line_seq from rs_data_1_af 
group by ds_id,ds_dt_id,inv_vcf_id,inv_sample_id,inv_variant_id,ds_dt_line_seq 
order by ds_id,ds_dt_id,inv_vcf_id,inv_sample_id,inv_variant_id,ds_dt_line_seq;

Это вывод:

Group  (cost=724728.48..780477.07 rows=314077 width=88) (actual time=10395.641..12546.322 rows=5703 loops=1)
  Group Key: ds_id, ds_dt_id, inv_vcf_id, inv_sample_id, inv_variant_id, ds_dt_line_seq
  Buffers: shared hit=80975, temp read=91041 written=91171
  ->  Sort  (cost=724728.48..732580.39 rows=3140766 width=80) (actual time=10395.619..12019.351 rows=3140766 loops=1)
        Sort Key: ds_id, ds_dt_id, inv_vcf_id, inv_sample_id, inv_variant_id, ds_dt_line_seq
        Sort Method: external merge  Disk: 286312kB
        Buffers: shared hit=75272, temp read=91041 written=91171
        ->  Seq Scan on rs_data_1_af  (cost=0.00..106679.66 rows=3140766 width=80) (actual time=0.009..575.729 rows=3140766 loops=1)
              Buffers: shared hit=75272
Planning Time: 0.478 ms
Execution Time: 12581.964 ms

Когда записи в таблице rs_data_1_af увеличиваются, у меня будет миллион строк, выполнение этого запроса занимает часы.

Как оптимизировать?

1 Ответ

0 голосов
/ 19 апреля 2020

Почему вы используете nextval('rec_id_seq_af')?

nextval() увеличивает индекс и возвращает следующее значение. Для каждой строки это должно быть сделано, чтение / запись изолированно, неудивительно, что это медленно.

Какова цель, возможно, вы можете использовать generate_series() или что-то еще?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...