2016-11-01 5 views
0

私は大きなテーブル(約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は、カラムがヌルを受け入れず、もっとも速いメソッドを使用するので、問題ではないことを検出するべきですか?

+0

あなたの 'DATE'カラムが' NOT NULL'であることを知っているなら、なぜ 'NULLS LAST'を指定していますか? – Nicarus

+0

インデックススキャンでは「DATE IS NOT NULL」という条件が使用されていたので、postgreがその条件をチェックしていたと考えることで 'NULLS LAST'を置くことになったため、最初の要素がポーズ・ネーブルであると考えられるため、 – rafael

+0

あなたの質問を編集して、 '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) –

答えて

0

オプティマイザをスマートにすることは、オプティマイザの速度を遅くすることも意味します。これは、誰もが傷ついてしまうからです。

現在のところ、スマートではないため、インデックス定義またはクエリを変更して機能させる必要があります。

pgsql-hackersメーリングリストでこのような改善を求めたり、自分でパッチを作成してそこに投稿したりする価値があります。

関連する問題