8

我有一个表 R 想要根据 z 列从中选择 3 个前任或后继者。我在 z 列上有一个 btree 索引。

SELECT key, z, x, y FROM R
    WHERE z <= some_value
    ORDER BY z DESC 
    LIMIT 3

立即检索前辈,但

SELECT key, z, x, y FROM R
    WHERE z >= some_value
    ORDER BY z ASC
    LIMIT 3

对于检索下一个条目是无用的,因为它开始扫描所有具有 z >= some_value 的行。Explain 给出了如何满足查询的相同解释。为什么会这样,我能做些什么呢?

编辑:实际上有两个索引,一个升序和一个降序。解释上面的两个查询:“限制(成本=0.00..31.91 行=3 宽度=20)”“-> 使用 zreverse 在 r 上向后扫描索引(成本=0.00..17727815.24 行=1666667 宽度=20)”“过滤器:(z >= some_value")

4

2 回答 2

2

嗯……

在 WHERE 子句中使用的 some_value 是由一个简单的函数计算的,该函数(错误地)定义为 VOLATILE。将其更改为 STABLE 解决了该问题。

于 2012-10-08T11:42:23.623 回答
1

z 上的索引是“普通”btree 索引,没有指定其他内容吗?或者它是以“降序”顺序创建的,即

create index <name> on R(z) desc;

?

很可能将相反的顺序索引添加到您拥有的索引上可能会有所帮助。

于 2012-10-08T11:02:25.663 回答