- ベストアンサー
インデックスについて
インデックスの有無は検索速度に大きな影響を与えると思いますが、どのような項目にインデックスを定義すると、効果が高いですか? また、同一テーブルに複数のインデックスが定義されていた場合に、使用するインデックスがどのようにして選択されるのでしょうか? 簡単な説明でけっこうですのでお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>どのような項目にインデックスを定義すると、効果が高いですか? カーディナリティ(=cardinality,基数,要素の数)が高いものに設定するのが効果的です。 高いもので最たる物は、プライマリーキー(主キー)になります。 >複数のインデックスが定義されていた場合に、 >使用するインデックスがどのようにして選択されるのでしょうか? オプチマイザが判断するコストが低い順です。 このコストが低いければ、インデックスがあっても使用されないこともあります。 インデックス1(a,b)、インデックス2(b,a)とあったとして、 条件がbに対してだけであれば、インデックス2が使用されますが、 インデックス1しかない状態であれば、インデックスはまず使用されません。 それは、インデックス1がbに対して索引にはならないからです。 では、使用される組み合わせ全てのインデックスを持てば効率的かといえば、 そうはなりません。 確かに照会では効率が上がるかもしれませんが、更新では効率が落ちてしまします。 さらに、物理的な資源を消費することにもなります。
その他の回答 (1)
- xcrOSgS2wY
- ベストアンサー率50% (1006/1985)
辞書を思い浮かべてください。そうしたら、次は辞書から単語を探すときのことを考えてください。 その単語をさがすときに、「あー50音順でよかった!」と思えるような単語の探し方をするのであれば、その探し方はインデクスの有無が検索速度に大きく影響するような探し方です。 逆に「なんだよ、50音順でも全然意味ないよ」と思えるような単語の探し方であれば、その探し方はインデクスの有無が検索速度に影響しないような探し方です。 2つ例を挙げます。 (1) 辞書から「検索」を調べるとします。その読み【けんさく】を辞書から探す場合、まず「か」の見出しを探して、次に「け」の前後を探して、さらに絞り込んで「けんさく」のページを開きますよね。 もし50音順でなかったら、「けんさく」にたどり着くのは大変です。こういう検索であれば、インデクスはとても役に立つということです。 (2) 辞書から「索」で終わる単語を調べるとします。 この場合、辞書の最初のページから最後のページまで、全部舐めるように調べる以外に方法がありませんから、50音順である必要が全くありません。こういう検索であれば、インデクスは全く役に立たないということです。 イメージつかめましたでしょうか。 次に複数あるインデクスから使用するものを選択する方法ですが、これはSQL Server自体がいくつかの評価基準をもっていて、それに照らして選択します。 例えば、カラムaについての完全一致を条件として検索する場合、まずaが含まれるインデクスがあるかどうかを調べます。 それが複数ある場合、次はaを含み、なおかつselectが返すカラムを全部含むようなインデクスがあるかどうか調べます。 それでも複数ある場合は・・・この先はちょっと知らないのですが、おそらく最小サイズのインデクスを選ぶのだと思います。必要なデータがすべて含まれていることが確かであれば、サイズが小さいほど検索速度の面で有利だからです。