我有一个表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&gt; = some_value的所有行。 Explain给出了关于如何满足查询的相同解释。 为什么这样,我能做些什么呢?
编辑: 实际上有两个索引,一个是升序,一个是降序。 解释上面的两个查询说: “限制(成本= 0.00..31.91行= 3宽度= 20)” “ - &gt;在r上使用zreverse向后扫描索引(成本= 0.00..17727815.24行= 1666667宽度= 20)” “过滤:( z&gt; = some_value”)
答案 0 :(得分:1)
z上的索引是&#34;普通&#34; btree索引没有指定其他内容?或者它是在&#34;降序&#34;订单,即
create index <name> on R(z) desc;
很可能在你所拥有的那个上添加相反的顺序索引可能有所帮助。
答案 1 :(得分:1)
...嗯
在WHERE子句中使用的some_value是由一个简单的函数计算的,该函数被(错误地)定义为VOLATILE。将其更改为STABLE解决了这个问题。