インデックスを扱う際に理解しておくべき重要な概念と用語がいくつかあります。シーク、スキャン、およびルックアップは、selectステートメントを通じてインデックスが利用される方法の一部です。キー列の選択性は、インデックスの有効性を決定するために不可欠です。
シークが発生するのは、SQL Server Query Optimizerが、要求したデータを見つける最良の方法がインデックス内の範囲をスキャンすることであると判断した場合です。通常、シークは、クエリがインデックスによって「カバー」されたときに発生します。つまり、シーク述語はインデックスキーにあり、表示された列はキーに含まれるか含まれます。SQL Serverクエリオプティマイザーが、データを見つけるための最良の方法はインデックス全体をスキャンしてから結果をフィルター処理することであると判断したときにスキャンが行われます。通常、ルックアップは、インデックスキーまたは含まれている列のいずれかに、要求されたすべての列がインデックスに含まれない場合に発生します。クエリオプティマイザーは、クラスター化キー(クラスター化インデックスに対して)またはRID(ヒープに対して)を使用して、他の要求された列を「ルックアップ」します。
通常、シーク操作は、より小さなデータセットを物理的にクエリするため、スキャンよりも効率的です。非常に小さな初期データセットなど、これが当てはまらない状況もありますが、それは質問の範囲を超えています。
ここで、インデックスの有効性を判断する方法を尋ねましたが、留意すべきことがいくつかあります。クラスター化インデックスのキー列は、クラスタリングキーと呼ばれます。これは、クラスター化インデックスのコンテキストでレコードを一意にする方法です。すべての非クラスター化インデックスには、必要に応じて検索を実行するために、デフォルトでクラスター化キーが含まれます。すべてのインデックスは、各DMLステートメントごとに挿入、更新、または削除されます。そうは言っても、selectステートメントのパフォーマンス向上とinsert、delete、およびupdateステートメントのパフォーマンスヒットとのバランスをとることが最善です。
インデックスの有効性を判断するには、インデックスキーの選択性を判断する必要があります。選択性は、合計レコードに対する個別のレコードの割合として定義できます。[person]テーブルに合計100個のレコードがあり、[first_name]列に90個の異なる値が含まれている場合、[first_name]列は90%の選択性があると言えます。選択性が高いほど、インデックスキーの効率が上がります。選択性を念頭に置いて、最も選択性の高い列をインデックスキーに最初に配置することをお勧めします。以前の[person]の例を使用して、95%の選択性を備えた[last_name]列があるとどうなりますか?[last_name]、[first_name]をインデックスキーとしてインデックスを作成します。
これは少し長めの答えだったと思いますが、インデックスがどれほど効果的であるかを判断する上で非常に多くの事柄があり、パフォーマンスの向上を比較検討する必要があることがたくさんあります。