web-dev-qa-db-ja.com

複合インデックスを使用する場合、SELECTクエリのフィールドの順序は重要ですか?

インデックス自体の列の順序が非常に重要であることを理解しています。ただし、そのインデックスを使用する後続のSELECTクエリの列の順序はどうでしょうか。

たとえば、_[:col_1, :col_2, :col_3]_に複数列のインデックスがある場合、クエリを最適化するには、SELECTステートメントを"SELECT * FROM my_table WHERE col_1 = (?), col_2 = (?), col_3 = (?)"のようにする必要がありますか?または、パラメーターを任意の順序で指定して、クエリオプティマイザーで処理することはできますか?

私は いくつかsimilar の回答を読みましたが、ドキュメントを指し、インデックスに関連して回答する決定的な回答はないようです。 「重要ではない」または「影響は無視できる」という回答もあります。

私はPostgreSQLでRoR/ActiveRecordを使用していますが、問題はSQL /リレーショナルDBに関するものです。

7
Sean

いいえ、「params」(where句の一部)は任意の順序で指定でき、クエリオプティマイザが処理します。オプティマイザは、最も効率的な順序でフィルタリングを実行しますが、これは、フィルタリングする順序を選択するよりも複雑であることに注意してください。たとえば、フィルタリングは、結合の前または後に行われる場合があります。

これを正確に証明することはできませんが、実験を行って計画が変更されるかどうかを確認することにより、特定のクエリに当てはまることを証明できます。 doesの順序が重要であるEdgeのケースがあることさえ事実かもしれませんが、私のアドバイスは、可能性を無視してそれが起こらないと想定することです。あなたが配当を支払うことができることがわかっている種類のチューニングに焦点を合わせる方がはるかに良いです(例えば、正しいインデックス付け)。