2016-11-01 14 views
0

我有一個大表(約11,000,000行),我需要找到給定排序條件的第一個項目。爲什麼Postgres不能在簡單的ORDER BY LIMIT 1上使用我的索引?

注意,列Date不爲什麼沒有Postgres的使用索引接受空

CREATE INDEX track_ix_date 
    ON "Track" 
    USING btree 
    ("Date" DESC NULLS LAST); 

在這個簡單的查詢:

select * from "Track" order by "Date" desc limit 1 

但它確實使用它在這另一個查詢:

select * from "Track" order by "Date" desc nulls last limit 1 

第二個查詢實際上比第一個查詢快得多。

我已閱讀indexes and ORDER BY文檔和說,在一個ORDER BYLIMIT條款的特殊情況下更加有效地使用,而不是掃描表中的索引,因爲排序將需要掃描整個表只是得到一個單一的項目

不應該Postgres檢測到nulls last/first並不重要,因爲列不接受空值,只使用最快的方法?

+0

如果你知道你的'DATE'列是'NOT NULL',你爲什麼要指定'NULLS LAST'? – Nicarus

+0

因爲我注意到索引掃描使用條件'DATE IS NOT NULL',所以我把'NULLS LAST'看作是postgre檢查的條件,因爲按降序排序時第一個元素被認爲是空的 – rafael

+0

請編輯你的問題,並添加使用'explain(analyze,verbose)'生成的執行計劃。 [_Formatted_](http://stackoverflow.com/editing-help#code)**文本**,請[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i - 未上傳圖像-的代碼上那麼當灰化-A-問題/ 285557#285557) –

回答

0

總是有一個折衷,因爲使優化器更智能也意味着優化器變慢,這會傷害每個人。

目前,它不夠智能,因此您必須更改索引定義或查詢才能使其工作。

可能值得在pgsql-hackers郵件列表上尋求這樣的改進,或者自己寫一個補丁並在那裏提交。

相關問題