即使是最简单的postresql查询,在带有索引的大表中也需要花费很长时间

时间:2019-01-15 21:50:18

标签: sql postgresql indexing google-cloud-platform query-performance

我的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 ScanBitmap 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

0 个答案:

没有答案