3

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

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

这是怎么回事?使用仅索引扫描,它应该优化请求,如此所述。为什么它很慢?

4

2 回答 2

3

尝试通过分析更新您的统计数据。当您将估计行 (1.620.001) 与实际行 (2.584.317) 进行比较时,您会发现优化器做得不好。

于 2013-09-14T10:04:34.437 回答
2

wikiheap fetches中似乎描述了这个特殊问题(注意高计数) :

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

从 9.2 开始,将页面添加到可见性地图有一个显着的好处,以便启用仅索引扫描。但是,这仅适用于无论如何都被清理的页面,因此除非用户调用手动 VACUUM,否则不会将没有更新或删除的页面设置为全部可见。这使得仅索引扫描的用处远不如它可能的用处。

于 2013-09-14T10:23:56.183 回答