私は大きなテーブル(約11,000,000行)を持っており、ソート条件が与えられた最初のアイテムを見つける必要があります。この単純なクエリにPostgresは簡単なORDER BY LIMIT 1でインデックスを使用しないのはなぜですか?
CREATE INDEX track_ix_date
ON "Track"
USING btree
("Date" DESC NULLS LAST);
:
select * from "Track" order by "Date" desc limit 1
しかし、それは使用しない列Date
がはなぜPostgresはインデックスを使用していないヌル
をを受け付けない
注意この他のクエリ:
select * from "Track" order by "Date" desc nulls last limit 1
2番目のクエリは、最初のクエリよりもはるかに高速です。
私はindexes and ORDER BYマニュアルを読み、ソートがちょうどに、フルテーブルをスキャンする必要がありますのでLIMIT
句とORDER BY
の特殊な場合には、はるかに効率的なインデックスの代わりに、テーブルをスキャンを使用することがあると言っているしています単一の項目を得る
Postgresは、nulls last/first
は、カラムがヌルを受け入れず、もっとも速いメソッドを使用するので、問題ではないことを検出するべきですか?
あなたの 'DATE'カラムが' NOT NULL'であることを知っているなら、なぜ 'NULLS LAST'を指定していますか? – Nicarus
インデックススキャンでは「DATE IS NOT NULL」という条件が使用されていたので、postgreがその条件をチェックしていたと考えることで 'NULLS LAST'を置くことになったため、最初の要素がポーズ・ネーブルであると考えられるため、 – rafael
あなたの質問を編集して、 'explain(analyze、verbose)'を使って生成された実行計画を追加してください。 [_Formatted_](http://stackoverflow.com/editing-help#code)**テキスト**お願い、[スクリーンショットなし](http://meta.stackoverflow.com/questions/285551/why-may-i -not-upload-images-of-code-on-so-ask-a-question/285557#285557) –