Даже самый простой запрос postresql занимает много времени в большой таблице с индексами - PullRequest
0 голосов
/ 16 января 2019

У меня проблема с очень медленным выполнением запроса в моей таблице psql, которая имеет 145 602 995 строк (да 145+ миллионов). У меня созданы индексы, но даже самый простой запрос может выполняться очень долго ... Например, запрос типа SELECT COUNT(*) FROM events; занимает 708 секунд (~ 12 минут).

У меня есть столбец с именем org_id, в котором есть индекс, и когда я пытаюсь выполнить запрос, например:

EXPLAIN ANALYZE SELECT COUNT(*) FROM events WHERE org_id = 1;

Aggregate  (cost=8191.76..8191.77 rows=1 width=8) (actual time=9.758..9.758 rows=1 loops=1)
  ->  Index Only Scan using org_id on events  (cost=0.57..8179.63 rows=4853 width=0) (actual time=1.172..9.729 rows=48 loops=1)
        Index Cond: (org_id = 1)
        Heap Fetches: 48
Planning time: 0.167 ms
Execution time: 9.803 ms

он использует индекс org_id, но предполагаемая стоимость была огромной.

При увеличении числа org_id время выполнения увеличивается. Вероятно, это связано с меньшим количеством записей для org_id с меньшими числами. Когда я попадаю в org_id = 9, где много записей, он перестает использовать индекс org_id и вместо него использует Bitmap Heap Scan и Bitmap Index Scan.

EXPLAIN SELECT COUNT(*) FROM events WHERE org_id = 9;
Aggregate  (cost=10834654.32..10834654.33 rows=1 width=8)
  ->  Bitmap Heap Scan on events  (cost=147380.56..10814983.35 rows=7868386 width=0)
        Recheck Cond: (org_id = 9)
        ->  Bitmap Index Scan on org_id  (cost=0.00..145413.46 rows=7868386 width=0)
              Index Cond: (org_id = 9)

Есть ли способ улучшить скорость с такими большими столами? Еще одна дополнительная информация - в этой таблице 11 столбцов, один из которых имеет тип jsonb NOT NULL. Просто упомяну. Может быть, это важно.

EDIT:

EXPLAIN (ANALYZE, BUFFERS) SELECT COUNT(*) FROM events;
Aggregate  (cost=12873195.66..12873195.67 rows=1 width=8) (actual time=653255.247..653255.248 rows=1 loops=1)
  Buffers: shared hit=292755 read=10754192
  ->  Seq Scan on events  (cost=0.00..12507945.93 rows=146099893 width=0) (actual time=0.015..638846.285 rows=146318426 loops=1)
        Buffers: shared hit=292755 read=10754192
Planning time: 0.215 ms
Execution time: 653255.315 ms
...