5

PostgreSQL で、3 つのカラムで複合インデックスを使用したいA, B, CBcreated_at日時であり、場合によっては なしでクエリを実行することがありますB

インデックスを複合して、条件を on で(A, B, C)クエリし、条件を onAでクエリしCないとどうなりBますか? (つまり、特定の時間範囲だけでなく、常にそれが必要ですか?AC

(A, B, C)Postgres は、 B をスキップするだけで複合インデックスを引き続き使用できるほどスマートですか?

4

2 に答える 2

7

Postgres は、B ツリー インデックスで先頭以外の列を使用できますが、効率が大幅に低下します。

最初の列が非常に選択的である ( ごとに数行しかないA) 場合、どちらのアクセス方法も (削減されたセットに対するシーケンシャル スキャンであっても) コストがかからないため、パフォーマンスの違いにほとんど気付かないでしょう。パフォーマンス ヒットは、 あたりの行数とともに増加しますA

(A, C, B)あなたが説明したケースでは、パフォーマンスを最適化するために、または(最後に来る(C, A, B)ことを確認してください)にインデックスを作成することをお勧めします。このようにして、Bクエリに対して最高のパフォーマンスを得ることができます。(A, B, C)(A, C)

インデックス内の列の順序とは異なり、クエリ内の述語の順序は重要ではありません。

これについては、dba.SE で詳しく説明しました。

目前のケースでリードするか、それをリードするかは問題ではないことに注意してください。A, CC, A

他にもいくつかの考慮事項がありますが、あなたの質問には関連する詳細がすべて含まれているわけではありません。

于 2015-03-23T18:50:28.940 に答える