我的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
类型。刚提到。也许很重要。
编辑:
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