2010-11-19 11 views
5
  • 私は非常に大きなテーブルを持っています。
  • 私は列col1にインデックスを持っています。
  • 私はcol1によって注文されたデータを取得したいと思います。
  • クエリプランからは、インデックスを使用しないと言うことができます。
  • "LIMIT"を追加すると、インデックスが使用され始めます。
  • "LIMIT"の値が大きい場合、インデックスの使用が停止します。

ヒント?Postgresは "ORDER BY"でインデックスを使用していません

P.S.私はcol1(必ずしもソートされていない)の値によってクラスタリングされたデータを取得したいと思います。「ORDER BY」以外の提案。

THANKS !!

+2

EXPLAIN ANALYZEの結果はどこですか?それがなければ、あなたが思うように物事が働いていない理由を誰も知らない。 –

答えて

5

テーブルからすべての行を戻す場合、インデックススキャンはテーブルスキャンよりも遅くなります。 なぜインデックスの使用が必要だと思いますか?

あなたはシーケンシャルスキャンを無効にするために、

set enable_seqscan = false

を使用しようとするかもしれませんが、私はそれがシーケンシャルスキャンよりも遅くなります確信しています。

ORDER BYはデータをソートする方法です。その他は、あなたが見るかもしれないソートは物事をクリアするには

編集
純粋な偶然の一致である:私ははないはオフスキャンし、配列を回すことをお勧めします。私はちょうどseqスキャンが本当にインデックススキャンよりも速いことを示す方法としてこれを投稿しました。オフにされると、索引スキャンを使用する実行計画は、索引スキャンの必要がないことをOPを示すseqスキャンよりもおそらく遅くなります。 a_horse_with_no_nameの答えに加えて

+0

これはキー→値テーブルとしましょう。私はすべての行を返したいが、同じキーを持つレコードは結果セット内で連続していなければならないが、ソートは本当に重要ではない。 –

+3

次に、 "ORDER BY the_key_column"節を追加します。あなたのデータをソートするのは唯一の信頼できる方法です –

+0

enable_seqscanをオフにすることは非常に悪い考えですが、実際の問題は解決しません。 –

4

:インデックスを使用して

は、実際には2つの異なる操作です:あなたが望む最初の値は、インデックス内で検索されます。インデックスには、参照解除される完全なレコードのアドレスが入ります。両方の操作は特定のクエリに対して非常に高速です。

とにかくすべてまたはほとんどのレコードを使用する予定の場合は、そのメリットがなくなります。すべてのレコードを必要とし、インデックスを通過する場合は、すべてのレコードに対して2つのシークがあるので、時間がかかります。索引なしでテーブル全体を実行するほうが、列ごとに1つのシークが必要になります(はい、私は知っていますが、ブロック全体が読み込まれているため実際にはそれ以下です。

+0

しかし、インデックスを使用するとソート時間が節約されると思います。 –

+0

いいえ、この全体の説明はなぜではないのですか? –

+3

同様の説明については、マニュアルの["Indexes and ORDER BY"](http://www.postgresql.org/docs/current/static/indexes-ordering.html)も参照してください。 –

関連する問題