【发布时间】:2012-09-28 14:45:40
【问题描述】:
我有一个表 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)” “ -> 在 r 上使用 zreverse 向后索引扫描(成本=0.00..17727815.24 行=1666667 宽度=20)” " 过滤器:(z >= some_value")
【问题讨论】:
-
您能否向我们发布这两个查询的 EXPLAIN 输出?有关如何使用此命令,请参阅 postgresql.org/docs/current/static/using-explain.html。
-
你试过
explain analyze而不是explain吗? -
问题在于用于计算 some_value 的简单函数,为了清楚起见,这里省略了...它被定义为 volatile 导致它为每一行单独计算。
标签: sql postgresql