为什么这个COUNT()在PostgreSQL 9.2中需要那么久?

时间:2013-09-14 09:52:58

标签: postgresql postgresql-9.2

我的表是(还有其他一些列):

id INTEGER
amount INTEGER

amount上有一个索引。查询是:

explain analyze select count(amount) from receipt

输出是:

Aggregate  (cost=215856.23..215856.23 rows=1 width=4) (actual time=180209.785..180209.787 rows=1 loops=1)
  ->  Index Only Scan using idx_amount on receipt  (cost=0.00..215046.23 rows=1620001 width=4) (actual time=0.109..177443.189 rows=2584317 loops=1)
        Heap Fetches: 2316761
Total runtime: 180209.868 ms

发生了什么事?使用仅索引扫描,它应该优化请求,如here所述。为什么这么慢?

2 个答案:

答案 0 :(得分:3)

尝试通过analyze更新您的统计信息。将估计的行(1.620.001)与实际行(2.584.317)进行比较时,您会发现优化器的工作做得不好。

答案 1 :(得分:2)

这个特殊问题(注意高heap fetches次)似乎在wiki中有所描述:

  

可见性吸尘和仅索引扫描问题:

     

从9.2开始,将页面添加到可见性图中有很大的好处   仅启用索引扫描。但是,这只能用于页面   无论如何都被抽真空了,所以没有更新或删除的页面   除非用户拨打手册,否则不会设置为all   真空。这使得仅索引扫描的效果远远低于它。