非クラスタ化インデックスの作成
1 つのテーブルまたはインデックス付きビューに複数の非クラスタ化インデックスを作成できます。一般に、非クラスタ化インデックスは、頻繁に使用され、クラスタ化インデックスで対応できないクエリのパフォーマンスを向上するために作成します。
一般的な実装
非クラスタ化インデックスは、次のように実装されます。
PRIMARY KEY 制約と UNIQUE 制約
PRIMARY KEY 制約を作成すると、テーブルにクラスタ化インデックスが存在せず、一意の非クラスタ化インデックスを指定しなかった場合、列に一意のクラスタ化インデックスが自動的に作成されます。主キー列には NULL 値を指定できません。
UNIQUE 制約を作成すると、既定では、一意な非クラスタ化インデックスが作成され、UNIQUE 制約が適用されます。テーブルにクラスタ化インデックスが存在しない場合は、一意なクラスタ化インデックスを指定できます。詳細については、「PRIMARY KEY 制約」および「UNIQUE 制約」を参照してください。
制約に依存しないインデックス
既定では、クラスタ化オプションが指定されていない場合に、非クラスタ化インデックスが作成されます。非クラスタ化インデックスは、1 つのテーブルに 999 個まで作成できます。これには、PRIMARY KEY 制約または UNIQUE 制約によって作成されたインデックスを含みますが、XML インデックスまたは空間インデックスは含みません。
インデックス付きビューの非クラスタ化インデックス
非クラスタ化インデックスは、ビューで一意なクラスタ化インデックスが作成されるまで作成できません。詳細については、「インデックス付きビューの作成」を参照してください。
付加列インデックス
クエリに対応するために非クラスタ化インデックスを作成すると、インデックス定義に非キー列を含めることで、主要な検索対象列として使用されていないクエリ内の列にも対応できます。クエリ オプティマイザでは、インデックス内で必要なすべての列データを見つけることができ、テーブルまたはクラスタ化インデックスへのアクセスが発生しないため、パフォーマンスが向上します。詳細については、「付加列インデックス」を参照してください。
フィルタ述語を使用するインデックス
フィルタ選択されたインデックスは、最適化された非クラスタ化インデックスであり、適切に定義されたデータのサブセットから選択するクエリに対応する際に特に適しています。フィルタ選択されたインデックスは、フィルタ述語を使用して、テーブル内の一部の行にインデックスを作成します。フィルタ選択されたインデックスを適切にデザインすると、クエリのパフォーマンスが向上し、インデックスのメンテナンス コストを削減して、テーブル全体のインデックスと比較してインデックスのストレージ コストを削減することができます。
詳細については、「フィルタ選択されたインデックスのデザイン ガイドライン」を参照してください。
パフォーマンスに関する注意点
クエリで使用するすべての列がインデックスに含まれていることは重要ですが、不要な列を追加しないように注意してください。インデックス列やキーまたは非キーを追加しすぎると、次のようなパフォーマンス上の問題が発生することがあります。
1 ページに収まるインデックス行が少なくなってディスク I/O が増加し、キャッシュの効率が低下します。
インデックスを格納するために、さらに多くのディスク領域が必要になります。
インデックス メンテナンスにより、基になるテーブルまたはインデックス付きビューに対する変更、挿入、更新、削除、マージにかかる時間が長くなります。
データ変更によるパフォーマンスへの影響や追加ディスク領域の要件よりも、クエリのパフォーマンスから得られる利点の方が大きいかどうかを判断する必要があります。クエリのパフォーマンスの評価に関する詳細については、「クエリのチューニング」を参照してください。
行のサブセットが明確に定義された列がテーブル データに含まれている場合は、フィルタ選択されたインデックスを使用してパフォーマンスを高めることを検討してください。このような列の例として、スパース列、ほとんどが NULL 値の列、さまざまなカテゴリの値を含む列、異なる範囲の値を含む列などが挙げられます。詳細については、「フィルタ選択されたインデックスのデザイン ガイドライン」を参照してください。
テーブルの作成時に PRIMARY KEY 制約または UNIQUE 制約を作成するには
既存のテーブルに PRIMARY KEY 制約または UNIQUE 制約を作成するには
インデックスを作成するには