インデックスの作成 (データベース エンジン)

このトピックでは、インデックス作成の主な作業について説明します。また、インデックスを作成する前に考慮する、実装とパフォーマンスのガイドラインについて説明します。

インデックス作成作業

インデックスを作成するには、次の作業を行うことをお勧めします。

  1. インデックスの設計。

    インデックスの設計は、重要な作業です。インデックスの設計には、使用する列の決定、インデックスの種類の選択 (クラスター化や非クラスター化など)、適切なインデックス オプションの選択、ファイル グループやパーティション構成の配置の決定などがあります。詳細については、「インデックスの設計」を参照してください。

  2. 最適な作成方法を決定します。インデックスは次の方法で作成されます。

    • CREATE TABLE や ALTER TABLE を使用して、列に PRIMARY KEY 制約または UNIQUE 制約を定義することで作成する方法。

      SQL Server データベース エンジンでは、PRIMARY KEY 制約や UNIQUE 制約の一意性要件を設定する一意インデックスが自動的に作成されます。既定では、テーブルにクラスター化インデックスが既に存在する場合を除いて、PRIMARY KEY 制約を設定するために一意クラスター化インデックスが作成されます。それ以外の場合は、一意非クラスター化インデックスを指定します。既定では、一意クラスター化インデックスが明示的に指定されている場合、またはテーブルにクラスター化インデックスが存在しない場合を除き、UNIQUE 制約を設定するために一意非クラスター化インデックスが作成されます。

      インデックス オプションとインデックスの位置、ファイル グループまたはパーティション構成も指定できます。

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

    • CREATE INDEX ステートメント、または SQL Server Management Studio オブジェクト エクスプローラーの [新しいインデックス] ダイアログ ボックスを使用して、制約とは無関係にインデックスを作成する方法。

      インデックス、テーブル、およびインデックスが適用される列の名前を指定する必要があります。インデックス オプションとインデックスの位置、ファイル グループまたはパーティション構成も指定できます。既定では、クラスター化オプションまたは一意オプションが指定されていない場合は、一意ではない非クラスター化インデックスが作成されます。フィルター選択されたインデックスを作成するには、オプションの WHERE 句を使用します。詳細については、「フィルター選択されたインデックスのデザイン ガイドライン」を参照してください。

  3. インデックスを作成する方法。

    空のテーブルにインデックスを作成するか、データが含まれるテーブルにインデックスを作成するかを考慮することは重要です。空のテーブルにインデックスを作成する場合、インデックスの作成時点ではパフォーマンスに影響しませんが、データをそのテーブルに追加するときにパフォーマンスに影響することになります。

    大きなテーブルにインデックスを作成する場合、データベースのパフォーマンスが低下しないように注意深く計画する必要があります。大きなテーブルにインデックスを作成する場合は、最初にクラスター化インデックスを作成してから、非クラスター化インデックスを作成することをお勧めします。既存のテーブルにインデックスを作成するときは、ONLINE オプションを ON に設定することを検討します。このオプションを ON に設定すると、テーブル ロックが長時間保持されず、基になるテーブルへのクエリまたは更新の続行が可能です。詳細については、「オンラインでのインデックス操作の実行」を参照してください。

実装に関する注意点

次の表に、クラスター化インデックス、非クラスター化インデックス、空間インデックス、フィルター選択されたインデックス、および XML インデックスに適用される最大値の一覧を示します。別途指定しない限り、すべての種類のインデックスに次の制限が適用されます。

インデックスの最大制限

関連情報

テーブルごとのクラスター化インデックス数

1

 

テーブルごとの非クラスター化インデックス数

999

この数には、PRIMARY KEY 制約または UNIQUE 制約によって作成された非クラスター化インデックス、およびフィルター選択されたインデックスも含まれますが、XML インデックスは含まれません。

テーブルごとの XML インデックス数

249

xml データ型の列のプライマリ XML インデックスとセカンダリ XML インデックスが含まれます。

XML データ型の列のインデックス

テーブルごとの空間インデックス数

249

空間インデックスの使用 (データベース エンジン)

インデックスごとのキー列の数

16*

テーブルにプライマリ XML インデックスまたは空間インデックスも含まれている場合、クラスター化インデックスは 15 列に制限されます。

インデックス キーの最大サイズ

インデックス キーのレコード サイズ

900 バイト*

XML インデックスまたは空間インデックスには適用されません。

空間インデックスをサポートするテーブルの場合、インデックス キーの最大レコード サイズは 895 バイトです。

インデックス キーの最大サイズ

* インデックスに非キー列を含めることにより、非クラスター化インデックスのインデックス キー列とレコード サイズの制限を回避できます。詳細については、「付加列インデックス」を参照してください。

データ型

通常、テーブルやビューの任意の列にインデックスを設定できます。次の表に、インデックスへの関与が制限されるデータ型の一覧を示します。

データ型

インデックスへの関与

関連情報

CLR ユーザー定義型

その型でバイナリ順がサポートされている場合は、インデックスを設定できます。

CLR ユーザー定義型の使用

ラージ オブジェクト (LOB) データ型。image、ntext、text、varchar(max)、nvarchar(max)、varbinary(max)、および xml。

インデックス キー列にはできません。ただし、XML 列を、テーブルのプライマリ XML インデックスまたはセカンダリ XML インデックスのキー列にすることはできます。

image、ntext、および text を除く非クラスター化インデックスに、非キー列 (付加列) として関与できます。

計算列式の一部の場合は、インデックスに関与できます。

付加列インデックス

XML データ型の列のインデックス

計算列

インデックスを設定できます。メソッドが決定的であるとマークされている限り、これには CLR ユーザー定義型列のメソッド呼び出しとして定義される計算列が含まれます。

計算列のデータ型をインデックス キー列または非キー列として使用できる限り、LOB データ型から派生した計算列は、キー列または非キー列としてインデックスを設定できます。

計算列に対するインデックスの作成

行外にプッシュされた Varchar

クラスター化インデックスのインデックス キーには、ROW_OVERFLOW_DATA アロケーション ユニットに既存のデータが含まれる varchar 型の列を含めることはできません。クラスター化インデックスが varchar 型の列に作成され、既存のデータが IN_ROW_DATA アロケーション ユニットに含まれる場合に、それ以後にその列でデータを行外にプッシュする挿入処理や更新処理を行うと失敗します。

テーブルとインデックスの編成

8 KB を超える場合の行オーバーフロー データ

geometry

複数の空間インデックスでインデックスを作成できます。

空間データの型

その他の注意点

次に、インデックスの作成でのその他の注意事項を示します。

  • テーブルに CONTROL 権限または ALTER 権限があれば、インデックスを作成できます。

  • インデックスは作成されると、自動的に有効になり、使用できるようになります。インデックスを無効化することによって、インデックスへのアクセスを削除できます。詳細については、「インデックスの無効化」を参照してください。

必要なディスク領域

インデックスの格納に必要なディスク領域は、次の要因によって異なります。

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

インデックスの物理的な作成にかかる時間は、ディスク サブシステムに大きく依存します。特に次の点に注意してください。

  • データベースの復旧モデル。一括ログ復旧モデルはパフォーマンスに優れ、インデックスの作成操作中に使用するログ領域が完全復旧よりも少なくなります。ただし、一括ログ復旧モデルでは特定の時点への復旧ができないので、この点に関しては柔軟性がありません。詳細については、「インデックス操作の復旧モデルの選択」を参照してください。

  • データベース ファイルとトランザクション ログ ファイルの格納に使用される RAID (Redundant Array of Independent Disks) レベル。通常、ストライピングを使用する RAID レベルは、I/O 帯域幅が優れています。

  • RAID を使用する場合、ディスク アレイ内のディスク数。アレイに含まれるドライブが多いほど、それに比例してデータ転送レートが増加します。

  • データの中間の並べ替え実行結果が格納される場所。tempdb がユーザー データベースとは異なるディスク セットにある場合、SORT_IN_TEMPDB オプションを使用すると、インデックスの作成に必要な時間を削減できます。詳細については、「tempdb とインデックスの作成」を参照してください。

  • オフラインまたはオンラインでのインデックスの作成

    インデックスがオフラインで作成されると (既定)、インデックスを作成するトランザクションが完了するまで、基になるテーブルで排他ロックが保持されます。そのため、インデックスの作成中は、ユーザーがテーブルにアクセスできません。

    XML インデックスおよび空間インデックス以外は、オンラインでのインデックスの作成を指定できます。オンライン オプションが ON に設定されていると、インデックス作成中に引き続き基になるテーブルへのクエリや更新が実行できるように、テーブル ロックは長時間保持されません。オンラインでのインデックス操作をお勧めしますが、そのためには環境や特定の要件を評価する必要があります。オフラインでインデックス操作を実行する方が適している場合もあります。オフラインでインデックスを作成すると、インデックス操作中はデータへのアクセスが制限されますが、操作は高速に終了し、使用するリソースも少なくなります。詳細については、「オンラインでのインデックス操作の実行」を参照してください。

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

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

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