質問

複数の列にインデックスを作成するときに、パフォーマンスの理由で最も選択的な列を最初に配置する必要があると言われて読んで読んでいます(しかし、誰も説明しませんでした)。何故ですか?それは神話ですか?

役に立ちましたか?

解決

最初に最も選択的な列を置く必要があります

トムによると, 、列の選択性には、インデックス内のすべての列を使用するクエリにパフォーマンスの影響はありません(インデックスを圧縮するOracleの能力に影響します)。

それは最初のことではなく、最も重要なことではありません。確かに、それは考慮すべきものですが、物事の壮大な計画では比較的遠いです。

特定の奇妙な、非常に独特で異常なケース(本当に完全に歪んだデータを持つ上記のように)では、選択性は簡単に重要である可能性があります。

a)かなりまれなb)すべての歪んだクエリは、実行時に使用される値に本当に依存しています

したがって、一般的に、あなたが持っている質問を見て、それに基づいて必要なインデックスを最小限に抑えるようにしてください。

インデックス内の位置を考慮すると、連結されたインデックス内の列の異なる値の数は関連しません。

ただし、これらの考慮事項は、インデックス列の順序を決定するときに次に来るはずです。さらに重要なのは、インデックスが多くのクエリに役立つことを確認することです。そのため、列の順序は、クエリの条項(Andrekrが説明した理由のために)の列(またはその欠如)の使用(またはその欠如)を反映する必要があります。

インデックスの使用方法 - それが決定するときに関連するものです。

他のすべてのものが平等ですが、私はまだ最も選択的な列を最初に置きます。それはちょうど正しいと感じています...

アップデート: トムからの別の引用 (それを見つけてくれたミラノに感謝します)。

Oracle 5(はい、バージョン5!)では、最も選択的な列を最初にインデックスに配置するという議論がありました。

それ以来、インデックスに最も差別的なエントリを最初に入れると、インデックスが小さくなったり効率的になったりすることは事実ではありません。そうなるようですが、そうではありません。

インデックスキー圧縮では、インデックスを小さくすることができるため、逆方向に進むという説得力のある議論があります。ただし、前述のように、インデックスの使用方法によって駆動される必要があります。

他のヒント

インデックスを使用するときに列を右から左に省略できます。つまり、インデックスがあるときに col_a, col_b で使用できます WHERE col_a = x しかし、あなたはそれを使用することはできません WHERE col_b = x.

ファーストネームでソートされた電話帳を持っていると想像してみてください その後 姓によって。

少なくともヨーロッパと米国のファーストネームは姓よりもはるかに低い選択性を持っているため、最初の名前を調べても、結果があまり狭くなることはありません。そのため、正しい姓をチェックするページがたくさんあります。

インデックス内の列の順序は、クエリによって決定され、選択性の考慮事項ではありません。 (a、b、c)にインデックスがあり、単一の列クエリのほとんどが列cに反して、次にaが続く場合は、最高の効率のためにインデックス定義でc、a、bの順に配置します。 。 Oracleは、クエリにインデックスのリーディングエッジを使用することを好みますが、Skip-Scanと呼ばれるより効率の低いアクセスパスで、インデックス内の他の列を使用できます。

インデックスがより選択的であるほど、最も速いのは研究です。

電話帳を想像するだけです。ラスト名でほとんど速い人を見つけることができます。しかし、同じLastNameを持っている人がたくさんいる場合は、毎回FirstNameを見ることで、その人を探すのが長く続くでしょう。

したがって、この問題を可能な限り避けるために、最初に最も選択的な列を提供する必要があります。

さらに、クエリがこれらの「選択性基準」を正しく使用していることを確認する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top