Postgresql命令和限制

时间:2012-10-08 10:51:30

标签: sql postgresql

我有一个表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”)

2 个答案:

答案 0 :(得分:1)

z上的索引是&#34;普通&#34; btree索引没有指定其他内容?或者它是在&#34;降序&#34;订单,即

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

很可能在你所拥有的那个上添加相反的顺序索引可能有所帮助。

答案 1 :(得分:1)

...嗯

在WHERE子句中使用的

some_value是由一个简单的函数计算的,该函数被(错误地)定义为VOLATILE。将其更改为STABLE解决了这个问题。