Postgresql order by 和 limit

PLa*_*ine 8 sql postgresql

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

SELECT key, z, x, y FROM R
    WHERE z <= some_value
    ORDER BY z DESC 
    LIMIT 3
Run Code Online (Sandbox Code Playgroud)

立即检索前辈,但

SELECT key, z, x, y FROM R
    WHERE z >= some_value
    ORDER BY z ASC
    LIMIT 3
Run Code Online (Sandbox Code Playgroud)

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

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

Col*_*art 1

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

create index <name> on R(z) desc;
Run Code Online (Sandbox Code Playgroud)

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