在这种情况下,为什么Postgresql不在我的复合索引上使用Index Only Scan?

时间:2015-06-18 15:14:03

标签: postgresql indexing count composite-index query-planner

我的表有整数列" a"," b"。 " a"只有少数(< 30)不同的值,但对于每个" a",大量不同的" b"存在(> 10 ** 7)。为了加快速度,我创建了复合索引(a,b)。我观察到了

select count(*) from tab where a=1; 

跑得快,也

select count(*) from tab where a=2;

跑得快,但是

select count(*) from tab where a=1 or a=2;

运行(哦 - 我 - 上帝 - 所以)慢,

也是如此
select count(*) from tab;

运行解释说明,快速查询使用

->  Index Only Scan using idx on tab

但对于慢查询,使用顺序扫描。

为什么会这样?为什么Postgresql不对后两个查询使用相同的索引?它只是查询规划器的不完美,还是有更深层次的原因导致无法使用Index Only Scan?

1 个答案:

答案 0 :(得分:1)

因为对于像a = 1这样的条件,不需要重新检查每一行的条件。因此,它只是遍历b树并计算所有具有a = 1的叶子。在这种情况下,无需引出实际数据。 我尝试使用= 1和a = 2的两个查询的联合,或者像< = 2这样的条件可以工作。