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

クラスタ化インデックスは、いくつかの例外を除くすべてのテーブルに必要です。クラスタ化インデックスは、クエリ パフォーマンスを向上するだけではなく、必要に応じて再構築または再構成してテーブルの断片化を制御することができます。また、クラスタ化インデックスをビューに作成することもできます。

一般的な実装

クラスタ化インデックスは、次のように実装されます。

  • PRIMARY KEY 制約と UNIQUE 制約

    PRIMARY KEY 制約を作成すると、テーブルにクラスタ化インデックスが存在せず、一意な非クラスタ化インデックスを指定しなかった場合、列に一意なクラスタ化インデックスが自動的に作成されます。主キー列は NULL 値を許可できません。

    UNIQUE 制約を作成すると、既定で、一意な非クラスタ化インデックスが作成され、UNIQUE 制約が適用されます。テーブルにクラスタ化インデックスが存在しない場合は、一意なクラスタ化インデックスを指定できます。

    制約の一部として作成されたインデックスには、自動的に制約名と同じ名前が指定されます。詳細については、「PRIMARY KEY 制約」および「UNIQUE 制約」を参照してください。

  • 制約に依存しないインデックス

    非クラスタ化主キー制約が指定された場合、主キー列以外の列にクラスタ化インデックスを作成できます。

  • インデックス付きビュー

    インデックス付きビューを作成するには、1 つ以上のビュー列で一意のクラスタ化インデックスを定義します。このビューは具体化され、テーブル データがクラスタ化インデックスに格納されるときと同じように、結果セットがインデックスのリーフ レベルに格納されます。詳細については、「インデックス付きビューの作成」を参照してください。

キー列の選択

クラスタ化インデックスは 1 つのテーブルにつき 1 つしか使用できないため、クラスタ化インデックスを作成する列を決定することは非常に重要です。適切な列の選択方法の詳細については、「クラスタ化インデックスの設計ガイドライン」を参照してください。

クラスタ化インデックスのインデックス キーには、ROW_OVERFLOW_DATA アロケーション ユニットに既存のデータを持つ varchar 型の列を含めることはできません。クラスタ化インデックスが varchar 型の列に作成され、既存のデータが IN_ROW_DATA アロケーション ユニットにある場合に、データを行外に押し出すような挿入処理や更新処理をその列に対して行うと失敗します。アロケーション ユニットの詳細については、「テーブルとインデックスの編成」を参照してください。

必要なディスク領域

クラスタ化インデックスの構造を作成する場合、古い (作成元の) 構造と新しい (作成先の) 構造の両方を格納するディスク領域が、それぞれのファイルとファイル グループで必要になります。古い構造の割り当ては、トランザクション全体がコミットされるまで解除されません。並べ替え操作用に、余分な一時ディスク領域が必要になる場合もあります。詳細については、「インデックスに必要なディスク領域の決定」を参照してください。

パフォーマンスに関する注意点

複数の非クラスタ化インデックスが存在するヒープにクラスタ化インデックスを作成する場合、すべての非クラスタ化インデックスを再構築して、行識別子 (RID) の代わりにクラスタ化キー値が含まれるようにする必要があります。同様に、複数の非クラスタ化インデックスを持つテーブルのクラスタ化インデックスを削除すると、DROP 操作の一部として非クラスタ化インデックスがすべて再構築されます。大きなテーブルでは、この操作に相当な時間がかかる場合があります。

大きなテーブルにインデックスを構築する場合、最初にクラスタ化インデックスを構築してから、非クラスタ化インデックスを構築することをお勧めします。既存のテーブルにインデックスを作成するときは、ONLINE オプションを ON に設定することを検討します。ON に設定すると、テーブル ロックは長時間保持されません。これにより、基になるテーブルに対するクエリまたは更新を続行できます。詳細については、「オンラインでのインデックス操作の実行」を参照してください。

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

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

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