テーブルにインデックスを付けるにはかなりの数の異なる方法があり、最もよく使用されるSELECTステートメントに応じて、複数のテーブルに異なるインデックスを付けることを選択できます。インデックスの2つの基本的なタイプは、クラスター化および非クラスター化と呼ばれます。
クラスタ化インデックスは、データベースがプルして実際のデータを見つけるために使用できる参照のリストを格納するのではなく、インデックス自体にすべての情報を格納します。これを視覚化する最も簡単な方法は、インデックスとテーブル自体を別々のオブジェクトと考えることです。クラスタ化インデックスでは、インデックスを作成した列が(WHERE句で)基準として使用される場合、クエリが取得する情報は、テーブルではなくインデックスから直接取得されます。
一方、非クラスター化インデックスは、参照テーブルに似ています。要求している実際の情報がテーブルオブジェクト自体のどこに格納されているかをクエリに通知します。したがって、本質的には、非クラスター化インデックスを使用する場合、テーブル自体から実際にデータを取得するという追加の手順が必要になります。
クラスター化インデックスは、データを物理的にハードディスクに順番に格納します。その結果、テーブルに含めることができるクラスター化インデックスは1つだけです(ディスクドライブには1つの「物理的」な方法でしかテーブルを格納できないため)。 。クラスタ化インデックスも一意である必要があります(これは肉眼では当てはまらない場合がありますが、データベース自体には常に当てはまります)。このため、ほとんどのクラスター化インデックスは主キーに配置されます(ほとんどの主キーは一意であるため)。
クラスター化インデックスとは異なり、非クラスター化インデックスは、実際のテーブル自体の単なる参照テーブルであるため、テーブルに必要な数だけ含めることができます。非クラスター化インデックスには基本的に無制限の数のオプションがあるため、ユーザーは、SELECTステートメントのWHERE句で一般的に使用される列に必要な数のオプションを配置することを好みます。
しかし、すべてのものと同様に、過剰は必ずしも良いとは限りません。テーブルに配置するインデックスが多いほど、そのテーブルには「オーバーヘッド」が多くなります。インデックスはクエリの実行を高速化する可能性がありますが、過度のオーバーヘッドもクエリの実行速度を低下させます。重要なのは、特定の状況に対して、インデックスが多すぎる場合とインデックスが不足している場合のバランスを見つけることです。
インデックスの有無にかかわらずクエリのパフォーマンスをテストするのに適した場所である限り、SQLServerを使用することをお勧めします。SQL Server Management Studioには、クエリの実行にかかるコストと時間を通知する「実行プラン」という関数があります。