インデックス キーの最大サイズ
多くのキー列または大きなサイズの列を含むインデックスを設計するときは、インデックス キーのサイズを計算して、インデックス キーの最大サイズを超えないようにする必要があります。SQL Server では、すべてのインデックス キー列の最大合計サイズは 900 バイトに制限されます。これには、非クラスター化インデックスの定義に含まれる非キー列は含まれません。
インデックス キーのサイズ計算
インデックス キーのサイズを計算するには、次の手順に従います。
インデックスの基準となるテーブル列のプロパティを表示します。sys.columns カタログ ビューを使用して、このプロパティを表示できます。
インデックス キーで定義される各列の長さを合計します。
たとえば、次のステートメントにより、Person.Address テーブルの指定した列について、sys.columns カタログ ビューの max_length 列が集計されます。
USE AdventureWorks2008R2; GO SELECT SUM(max_length)AS TotalIndexKeySize FROM sys.columns WHERE name IN (N'AddressLine1', N'AddressLine2', N'City', N'StateProvinceID', N'PostalCode') AND object_id = OBJECT_ID(N'Person.Address');
注 テーブル列が nchar や nvarchar などの Unicode データ型の場合、表示される列の長さは列の記憶域の長さを表します。つまり、CREATE TABLE ステートメントで指定した文字数の 2 倍になります。上記の例では、City が nvarchar(30) データ型として定義されているので、列の記憶域の長さは 60 です。
長さの合計が 900 バイト未満の場合、その列はインデックス キー列として参加できます。長さの合計が 900 バイトを超える場合、オプションと追加の注意事項に関する次の情報を確認してください。
CREATE INDEX ステートメントでは次のアルゴリズムを使用して、インデックス キーのサイズが計算されます。
すべての固定長キー列のサイズと CREATE INDEX ステートメントで指定されているすべての可変長キー列の最大サイズの合計が 900 バイト未満の場合、CREATE INDEX ステートメントは問題なく完了し、警告もエラーも発生しません。
すべての固定長キー列のサイズとすべての可変長キー列の最大サイズの合計が 900 バイトを超えても、すべての固定長キー列のサイズと可変長キー列の最小サイズの合計が 900 バイト未満の場合、CREATE INDEX ステートメントは成功します。ただし、それ以降の INSERT ステートメントまたは UPDATE ステートメントが 900 バイトより大きいキー値を生成する値を指定するとステートメントが失敗することがあるという警告が生成されます。テーブル内の既存のデータ行に、900 バイトより大きいキーを生成する値がある場合、CREATE INDEX ステートメントは失敗します。それ以降の INSERT ステートメントまたは UPDATE ステートメントで 900 バイトより長いキー値を生成するデータ値を指定すると、失敗します。
すべての固定長キー列のサイズと CREATE INDEX ステートメントで指定されているすべての可変長列の最小サイズの合計が 900 バイトを超える場合、CREATE INDEX ステートメントは失敗します。
次の表に、最大のインデックス キー サイズの制限を満たすインデックス、または制限を超えるインデックスを作成した結果をまとめます。
可変長の列の最小サイズ + 固定長の列のサイズ |
可変長の列の最大サイズ + 固定長の列のサイズ |
既存の行のインデックス キー列の長さを合計した最大値 * |
インデックスの作成 |
メッセージの種類 |
サイズ超過インデックス キー値による INSERT、UPDATE の実行時エラー |
---|---|---|---|---|---|
> 900 バイト |
該当なし |
該当なし |
不可 |
エラー |
エラーを生成するインデックスはありません。 |
<= 900 バイト |
<= 900 バイト |
該当なし |
可 |
なし |
ありません。 |
<= 900 バイト |
> 900 バイト |
<= 900 バイト |
可 |
警告 |
すべてのインデックス列の現在の長さの合計が 900 バイトを超える場合のみ。 |
<= 900 バイト |
> 900 バイト |
> 900 バイト |
不可 |
エラー |
エラーを生成するインデックスはありません。 |
* CREATE INDEX ステートメントを実行したとき、このテーブルには、長さの合計が 900 バイトを超えるインデックス キー値を持つ行は存在しません。
サイズ制限を回避するための付加列の使用
非クラスター化インデックスに非キー列を含めることで、現在のインデックス サイズの制限 (最大 16 個のキー列と最大 900 バイトのインデックス キーのサイズ) を超えないようにできます。インデックス キー列の数やインデックス キー列の合計サイズを計算するときに、SQL Server データベース エンジンでは非キー列が考慮されません。付加列を含む非クラスター化インデックスでは、インデックス キー列の合計サイズが 900 バイトに制限されます。すべての非キー列の合計サイズは、INCLUDE 句で指定された列のサイズによってのみ制限されます。たとえば、varchar(max) 列は 2 GB に制限されます。INCLUDE 句の列は、text、ntext、および image を除く、すべてのデータ型にできます。
注 |
---|
テーブルがパーティション分割される際に、一意でないクラスター化インデックスにパーティション分割キー列がまだ存在しない場合は、それらの列がデータベース エンジンによってインデックスに追加されます。一意でないクラスター化インデックスでは、インデックス付き列の合計サイズ (付加列はカウントしません) と、追加されたパーティション分割列のサイズとを足した合計が 1,800 バイトを超えないようにしてください。 |