我的表有整数列" 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?
答案 0 :(得分:1)
因为对于像a = 1这样的条件,不需要重新检查每一行的条件。因此,它只是遍历b树并计算所有具有a = 1的叶子。在这种情况下,无需引出实际数据。 我尝试使用= 1和a = 2的两个查询的联合,或者像< = 2这样的条件可以工作。