2010-11-24 28 views
4

パフォーマンスの理由から、複数の列にインデックスを作成するときに最も選択的な列を最初に置く必要があることは、どこからでも(それを説明する人は誰も説明しない) なぜですか? それは神話ですか?複数列インデックスの列順序

+1

質問に多くの答えがありますので、私はしません – milan

答えて

6

は私が

According to Tom最初の最も選択の列を置く必要があり、列の選択が、インデックスのすべての列を使用するクエリのパフォーマンスに影響を与えません(これは、インデックスを圧縮するOracleの機能には影響しません)。

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

(本当に全くスキューデータと上記のような)特定の奇妙な、非常に独特かつ異常なケースでは、選択性は、簡単に使用する値に本当に依存して)彼らは

a)はかなり稀 bは、もつとも重要でできましたすべてのスキューされたクエリはすべて実行時に

です。一般的には質問を見て、それに基づいて必要なインデックスを最小限に抑えてください。

インデックス内の位置を とみなした場合、連結インデックス内の列内の別個の値の数は関係ありません。

ただし、インデックス列の順序を決定する際には、これらの考慮事項が2番目になるはずです。さらに重要なのは、索引が多くの照会に役立つことを保証することです。そのため、列の順序は、照会のwhere句(これらの列の欠落)を反映する必要があります(理由はAndreKRです)。

インデックスをどのように使用するかは、決定時に関係します。

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

更新:Another quote from Tom(milanの検索に感謝します)。オラクル5では

(はい、バージョン5!)、インデックス内 最初の最も選択列を配置するための引数がありました。

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

インデックスの場合、 のキー圧縮では、インデックスが より小さくなる可能性があるため、他の方法を実行するための説得力のある引数があります。しかし、前述のように、インデックスをどのように使用するかによって駆動されるべきです。

+0

インデックスの圧縮情報が少しメモとしてありますが、無視してはいけません。インデックスを圧縮することはすばらしいアイデアです。 – Craig

+0

@Craig:列の順序が索引の圧縮にどのように影響するかを見ることができますが、その逆のことはできません(繰り返しの圧縮可能な接頭辞をもたらす低カーディナリティの先頭列)。 – Thilo

+0

Tomは** Oracle 5 **に対してhttp://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1296165726968#59899084713981 – milan

6

インデックスを使用しているときに右から左へ列を省略することができます。つまり、インデックスがcol_a, col_bの場合はWHERE col_a = xで使用できますが、WHERE col_b = xでは使用できません。

でソートされた電話帳と、次に姓でとソートされているとします。

少なくともヨーロッパとアメリカのファーストネームは、ラストネームよりも選択性がはるかに低いため、ファーストネームを検索しても結果セットが狭くならないため、正しい姓。

+5

+1。先頭の列が見つからない場合でも索引を使用できますが、完全な索引スキャン(または索引スキップ・スキャン)がありますが、効率的ではありません(全表スキャンよりも優れています)。 – Thilo

+0

これは選択性についての部分には答えません。 – Thilo

+0

私は少なくともヨーロッパとアメリカのファーストネームは姓よりはるかに低い選択性を持っていると思うので、ファーストネームのインデックスはまず役に立ちません。 – AndreKR

2

インデックス内の列の順序は、クエリによって決定され、選択性の考慮事項ではありません。インデックスが(a、b、c)であり、単一の列クエリの大部分が列c、その次にある場合は、インデックス定義のc、a、bの順に並べて、最高の効率を得ます。 Oracleは問合せの索引の最先端を使用することを好みますが、スキップ・スキャンと呼ばれる効率の悪いアクセス・パスで索引内の他の列を使用できます。

1

インデックスが選択されるほど、速いのが研究です。

単純に電話帳を想像してみてください。しかし、同じ姓の人がたくさんいる場合は、毎回ファーストネームを見ることでその人を探し出す時間が長くなります。

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

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

+0

+1と言っています。それはまさに正しいことです。これが行われたと仮定すると、(AndrewKR)列を右から左にドロップすることができます。 – PerformanceDBA

関連する問題