Share via


非クラスター化インデックスの作成

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 制約を作成するには

CREATE TABLE (Transact-SQL)

既存のテーブルに PRIMARY KEY 制約または UNIQUE 制約を作成するには

ALTER TABLE (Transact-SQL)

インデックスを作成するには

CREATE INDEX (Transact-SQL)