2012-10-08 88 views
3

我有一個表R從哪個想要選擇3前任或後繼基於z列。我在z列上有一個btree索引。Postgresql排序和限制

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 

是無用的檢索下一個條目,因爲是開始通過有ž> = SOME_VALUE的所有行掃描的前輩。解釋給出了關於如何滿足查詢的相同解釋。 這是爲什麼,我該怎麼辦?

編輯: 實際上有兩個指標,一個升序和一個降序。 對上述兩個查詢的解釋說: 「Limit(cost = 0.00..31.91 rows = 3 width = 20)」 「 - >使用r上的zreverse向後索引掃描(cost = 0.00..17727815.24 rows = 1666667 width = 20 )「 」篩選器:(z> = some_value「)

+0

您能否將這兩個查詢的EXPLAIN輸出發佈給我們?有關如何使用此命令,請參閱http://www.postgresql.org/docs/current/static/using-explain.html。 –

+0

您是否嘗試過'解釋分析'而不是'解釋'? –

+0

問題是用簡單的函數來計算some_value這裏爲了清楚起見省略了......它被定義爲volatile,它使得它被分別計算爲每一行。 – PLaine

回答

1

z上的索引是」普通「btree索引,沒有其他指定?或者它是按「降序」順序創建的,即如

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

很可能在您所擁有的指令中添加相反的指令可能會有所幫助。

+0

嘗試過,但它沒有 – PLaine

1

嗯... WHERE子句中使用

SOME_VALUE通過簡單的函數,它是(錯誤地)定義VOLATILE計算。將其更改爲STABLE可解決問題。

+0

很高興知道這一點:根據http://www.postgresql.org/docs/current/static/xfunc-volatility.html,優化程序不會對從標記爲volatile的函數返回的值做任何假設,每行執行一次該函數。如果標記爲穩定,優化器知道返回的值對於相同的輸入將是相同的,並且可以優化功能的執行 - 例如用於索引掃描。 –