私は多くの SQL の本や記事で、インデックスを作成する上で選択性が重要な要素であると読んでいます。列の選択性が低い場合、インデックス シークはより大きな害を及ぼします。しかし、その理由を説明している記事はありません。その理由を説明したり、関連記事へのリンクを提供したりできますか?
2 に答える
Robert Sheldon による SimpleTalk の記事から: SQL Server のインデックスに関する 14 の質問 You We Are Too Shy To Ask
キー列内の一意の値の比率は、インデックスの選択性と呼ばれます。値が一意であるほど、選択性が高くなります。これは、一意のインデックスの選択性が可能な限り高くなることを意味します。クエリ エンジンは、特にそれらの列が頻繁に実行されるクエリの WHERE 句で参照されている場合、高度に選択的なキー列を好みます。選択性が高いほど、クエリ エンジンはより速く結果セットのサイズを縮小できます。もちろん、反対に、一意の値が比較的少ない列は、インデックス作成に適した候補になることはめったにありません。
これらの記事もチェックしてください。
- Pinal Daveによるこの投稿を確認してください
- this other on SQL Serverpedia
- SqlServerCentral に関するこのフォーラム投稿も役に立ちます。
- SqlServerCentral に関するこの記事も
SqlServerCentral の記事から:
一般に、非クラスター化インデックスは選択的である必要があります。つまり、列の値はかなり一意である必要があり、それをフィルター処理するクエリはテーブルの小さな部分を返す必要があります。
この理由は、キー/RID ルックアップは高価な操作であり、非クラスター化インデックスを使用してクエリを評価する場合は、ルックアップのコストが高すぎると見なされないようにカバーするか、十分に選択的である必要があるためです。
インデックス (またはクエリがシークするインデックス キーのサブセット) の選択性が不十分であると SQL が判断した場合、インデックスが無視され、クエリがクラスター化インデックス (テーブル) スキャンとして実行される可能性が高くなります。
これは先頭の列だけに当てはまるわけではないことに注意してください。非常に非選択的な列を先行列として使用できるシナリオがあり、索引内の他の列を使用するのに十分な選択性があります。
私は非常に簡単な説明を書こうとしています(Sql Serverに関する私の現在の知識に基づいています):
インデックスの選択性が低い場合、同じ値に対して、合計行のより大きなパーセンテージが検出されることを意味します。(500行から200行がインデックスベースで同じ値を持つように)
通常、インデックスに必要なすべての列情報が含まれていない場合は、ポインターを使用して、インデックスのその「エントリ」に接続されている行を物理的に検索します。次に、2 番目のステップで、エンジンはその行を読み取る必要があります。
このように、2 つのステップを使用した検索が表示されます。そして、ここに選択性があります:
選択性が低いため、より多くの結果を得ることができます。このため、選択性が非常に低いインデックス シークよりもテーブル スキャンの方が効率的である場合があります。