私は、パフォーマンス上の理由から、複数の列でインデックスを作成するときは、最も選択的な列を最初に配置する必要があると言われ、どこでもそれを読みました (しかし、誰もあえて理由を説明しませんでした)。何故ですか?それは神話ですか?
4 に答える
最も選択的な列を最初に配置する必要があります
Tomによると、列の選択性は、インデックス内のすべての列を使用するクエリのパフォーマンスに影響を与えません(これは、インデックスを圧縮するOracleの機能に影響します)。
それは最初のものではなく、最も重要なことでもありません。確かに、それは考慮すべきことですが、それは物事の壮大な計画の中で比較的はるかに下にあります。
特定の奇妙で非常に特殊で異常なケース(上記のようにデータが完全に歪んでいる場合)では、選択性が簡単に問題になる可能性がありますが、
a)非常にまれですb)すべての偏ったクエリは
したがって、一般的に、あなたが持っている質問を見て、それに基づいて必要なインデックスを最小化するようにしてください。
連結インデックスの列にある個別の値の数は、インデックス内の位置を考慮する場合は関係ありません。
ただし、これらの考慮事項は、インデックス列の順序を決定するときに2番目に来る必要があります。さらに重要なのは、インデックスが多くのクエリに役立つことを確認することです。そのため、列の順序は、クエリのwhere句でのそれらの列の使用(またはその欠如)を反映する必要があります(AndreKRで示されている理由により)。
インデックスの使用方法-これは、決定するときに関連するものです。
他のすべての条件が同じであれば、私は依然として最も選択的な列を最初に置きます。それはちょうどいい感じです...
更新: トムからの別の引用(それを見つけてくれたmilanに感謝します)。
Oracle 5(はい、バージョン5!)では、最も選択的な列をインデックスの最初に配置するという議論がありました。
それ以来、最も識別力のあるエントリをインデックスの最初に配置することで、インデックスが小さくなったり、効率が向上したりすることは事実ではありません。そうなるようですが、そうではありません。
インデックスキーの圧縮では、インデックスを小さくすることができるため、逆の方向に進む説得力のある議論があります。ただし、前述のように、インデックスの使用方法によって決定される必要があります。
インデックスを使用する場合、列を右から左に省略できます。つまり、インデックスがある場合、では使用col_a, col_b
できWHERE col_a = x
ますが、 では使用できませんWHERE col_b = x
。
ファースト ネームとラスト ネームの順に並べ替えられた電話帳があるとします。
少なくともヨーロッパと米国では、名は姓よりもはるかに低い選択性を持っているため、名を検索しても結果セットはあまり絞り込まれないため、正しい姓を確認するページはまだ多くあります。
インデックス内の列の順序はクエリによって決定される必要があり、選択性に関する考慮事項ではありません。(a、b、c) にインデックスがあり、ほとんどの単一列クエリが列 c に対して行われ、その後に a が続く場合、最高の効率を得るために、インデックス定義で c、a、b の順序でそれらを配置します。 . Oracle はクエリにインデックスの先頭を使用することを好みますが、スキップ スキャンと呼ばれる非効率的なアクセス パスでインデックス内の他の列を使用できます。
インデックスがより選択的であるほど、調査は最速になります。
電話帳を想像してみてください。ほとんどの場合、姓ですぐに誰かを見つけることができます。しかし、同じ姓の人がたくさんいる場合は、毎回名を見ることで、その人を探す時間が長くなります。
したがって、この問題をできるだけ回避するために、最初に最も選択的な列を指定する必要があります。
さらに、クエリがこれらの「選択基準」を正しく使用していることを確認する必要があります。