2

我的表有整数列“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 的更深层次的原因?

4

1 回答 1

1

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

于 2015-08-04T09:55:57.367 回答