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 BY
用LIMIT
條款的特殊情況下更加有效地使用,而不是掃描表中的索引,因爲排序將需要掃描整個表只是得到一個單一的項目
不應該Postgres檢測到nulls last/first
並不重要,因爲列不接受空值,只使用最快的方法?
如果你知道你的'DATE'列是'NOT NULL',你爲什麼要指定'NULLS LAST'? – Nicarus
因爲我注意到索引掃描使用條件'DATE IS NOT NULL',所以我把'NULLS LAST'看作是postgre檢查的條件,因爲按降序排序時第一個元素被認爲是空的 – rafael
請編輯你的問題,並添加使用'explain(analyze,verbose)'生成的執行計劃。 [_Formatted_](http://stackoverflow.com/editing-help#code)**文本**,請[無屏幕截圖](http://meta.stackoverflow.com/questions/285551/why-may-i - 未上傳圖像-的代碼上那麼當灰化-A-問題/ 285557#285557) –