ALTER INDEX (Transact-SQL)
インデックスの無効化、再構築、再構成によって、またはインデックスに関するオプションの設定によって、既存のテーブルやビュー インデックス (リレーショナルまたは XML) を変更します。
構文
ALTER INDEX { index_name | ALL }
ON <object>
{ REBUILD
[ [PARTITION = ALL]
[ WITH ( <rebuild_index_option> [ ,...n ] ) ]
| [ PARTITION = partition_number
[ WITH ( <single_partition_rebuild_index_option>
[ ,...n ] )
]
]
]
| DISABLE
| REORGANIZE
[ PARTITION = partition_number ]
[ WITH ( LOB_COMPACTION = { ON | OFF } ) ]
| SET ( <set_index_option> [ ,...n ] )
}
[ ; ]
<object> ::=
{
[ database_name. [ schema_name ] . | schema_name. ]
table_or_view_name
}
<rebuild_index_option > ::=
{
PAD_INDEX = { ON | OFF }
| FILLFACTOR = fillfactor
| SORT_IN_TEMPDB = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
| ONLINE = { ON | OFF }
| ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE }
[ ON PARTITIONS ( { <partition_number_expression> | <range> }
[ , ...n ] ) ]
}
<range> ::=
<partition_number_expression> TO <partition_number_expression>
}
<single_partition_rebuild_index_option> ::=
{
SORT_IN_TEMPDB = { ON | OFF }
| MAXDOP = max_degree_of_parallelism
| DATA_COMPRESSION = { NONE | ROW | PAGE } }
}
<set_index_option>::=
{
ALLOW_ROW_LOCKS = { ON | OFF }
| ALLOW_PAGE_LOCKS = { ON | OFF }
| IGNORE_DUP_KEY = { ON | OFF }
| STATISTICS_NORECOMPUTE = { ON | OFF }
}
引数
index_name
インデックスの名前。インデックス名は、テーブルまたはビュー内では一意である必要がありますが、データベース内で一意である必要はありません。インデックス名は、識別子のルールに従っている必要があります。ALL
インデックスの種類に関係なく、テーブルまたはビューに関連付けられているすべてのインデックスを指定します。1 つ以上のインデックスがオフラインまたは読み取り専用のファイル グループにあるか、指定した操作が 1 つ以上のインデックスの種類に許可されていない場合、ALL を指定するとステートメントは失敗します。次の表は、インデックス操作と、許可されないインデックスの種類の一覧です。ALL を指定する操作
テーブル内に存在すると操作が失敗するインデックスの種類
REBUILD WITH ONLINE = ON
XML インデックス
空間インデックス
REBUILD PARTITION = partition_number
非パーティション インデックス、XML インデックス、空間インデックス、または無効化されたインデックス
REORGANIZE
ALLOW_PAGE_LOCKS が OFF に設定されたインデックス
REORGANIZE PARTITION = partition_number
非パーティション インデックス、XML インデックス、空間インデックス、または無効化されたインデックス
IGNORE_DUP_KEY = ON
空間インデックス
XML インデックス
ONLINE = ON
空間インデックス
XML インデックス
注意 オンラインで実行できるインデックス操作の詳細については、「オンライン インデックス操作のガイドライン」を参照してください。
ALL を PARTITION = partition_number と共に指定する場合、すべてのインデックスを固定する必要があります。つまり、すべてのインデックスは、等価パーティション関数に基づいてパーティション分割されます。ALL を PARTITION 句と共に使用すると、同じ partition_number のすべてのインデックス パーティションが再構築または再構成されることになります。パーティション インデックスの詳細については、「パーティション テーブルとパーティション インデックス」を参照してください。
database_name
データベースの名前を指定します。schema_name
テーブルまたはビューが属するスキーマの名前です。table_or_view_name
インデックスに関連付けられているテーブルまたはビューの名前を指定します。オブジェクトに対するインデックスのレポートを表示するには、sys.indexes カタログ ビューを使用します。REBUILD [ WITH (<rebuild_index_option> [ ,... n]) ]
同じ列、インデックスの種類、一意性属性、および並べ替え順に従って、インデックスを再構築します。この句には DBCC DBREINDEX と同じ機能があります。REBUILD では、無効化されたインデックスが有効になります。クラスター化インデックスを再構築しても、キーワード ALL を指定しない限り、関連付けられている非クラスター化インデックスは再構築されません。インデックス オプションを指定しない場合は、sys.indexes に格納されている既存のインデックス オプション値が適用されます。値が sys.indexes に格納されていないインデックス オプションについては、オプションの引数に定義されている既定値が適用されます。オプション ONLINE = ON および IGNORE_DUP_KEY = ON は、XML インデックスや空間インデックスの再構築では無効になります。
ALL を指定した場合で、基になるテーブルがヒープの場合、テーブルは再構築操作の影響を受けません。テーブルに関連付けられている非クラスター化インデックスは再構築されます。
データベース復旧モデルが一括ログ復旧モデルまたは単純復旧モデルのいずれかに設定されている場合、再構築操作のログへの記録は最小限にできます。
注 プライマリ XML インデックスを再構築するとき、基になるユーザー テーブルはインデックス操作の間使用できなくなります。
PARTITION
インデックスの 1 つのパーティションのみを再構築または再構成します。PARTITION は、index_name がパーティション インデックス以外の場合は指定できません。PARTITION = ALL により、すべてのパーティションが再構築されます。
注意 固定されていないインデックスをパーティションが 1, 000 個以上あるテーブルに作成または再構築することは可能ですが、サポートされていません。このような操作を行うと、操作中にパフォーマンスが低下したりメモリが過度に消費される可能性があります。パーティションの数が 1, 000 個を超えた場合は、固定されたインデックスのみを使用することをお勧めします。
partition_number
再構築または再構成するパーティション インデックスのパーティション番号を指定します。partition_number は、変数を参照できる定数式です。これにはユーザー定義型変数または関数、およびユーザー定義関数が含まれますが、Transact-SQL ステートメントを参照することはできません。partition_number は必須であり、指定しないとステートメントは失敗します。WITH (<single_partition_rebuild_index_option>)
SORT_IN_TEMPDB、MAXDOP、および DATA_COMPRESSION は、単一のパーティションを再構築するとき (PARTITION = n) に指定できるオプションです。XML インデックスは、単一のパーティションの再構築操作では指定できません。パーティション インデックスの再構築はオンラインでは実行できません。この操作中、すべてのテーブルがロックされます。
DISABLE
インデックスを無効とマークし、データベース エンジンで使用されないようにします。どのインデックスも無効にできます。無効になったインデックスのインデックス定義は、基になるインデックス データがなくてもシステム カタログに残ります。クラスター化インデックスを無効にすると、ユーザーは基になるテーブルのデータにアクセスできなくなります。インデックスを有効にするには、ALTER INDEX REBUILD または CREATE INDEX WITH DROP_EXISTING を使用します。詳細については、「インデックスと制約の無効化」および「インデックスと制約の有効化」を参照してください。REORGANIZE
インデックスのリーフ レベルを再構成します。ALTER INDEX REORGANIZE ステートメントは、常にオンラインで実行されます。つまり、ALTER INDEX REORGANIZE トランザクション中は、長期にわたって他をブロックするテーブル ロックは保持されず、基になるテーブルへのクエリまたは更新を続行できます。REORGANIZE は、無効化されたインデックスまたは ALLOW_PAGE_LOCKS が OFF に設定されているインデックスに対しては指定できません。WITH ( LOB_COMPACTION = { ON | OFF } )
ラージ オブジェクト (LOB) データを含むすべてのページを圧縮します。LOB データ型は、image、text、ntext、varchar(max)、nvarchar(max)、varbinary(max)、および xml です。このデータを圧縮すると、使用できるディスク領域が増加します。既定値は ON です。ON
ラージ オブジェクト データを含むすべてのページが圧縮されます。特定のクラスター化インデックスを再構成すると、クラスター化インデックスに含まれるすべての LOB 列が圧縮されます。非クラスター化インデックスを再構成すると、そのインデックス内で非キー列 (付加列) となっているすべての LOB 列が圧縮されます。
ALL を指定すると、指定したテーブルまたはビューに関連付けられているすべてのインデックスは再構成され、クラスター化インデックスに関連付けられているすべての LOB 列、基になるテーブル、または付加列のある非クラスター化インデックスは圧縮されます。
OFF
ラージ オブジェクト データを含むページは圧縮されません。OFF の指定は、ヒープには影響しません。
LOB 列が存在しない場合、LOB_COMPACTION 句は無視されます。
SET ( <set_index option> [ ,... n] )
インデックスを再構築または再構成しないでインデックス オプションを指定します。無効化されたインデックスには、SET は指定できません。PAD_INDEX = { ON | OFF }
インデックスの埋め込みを指定します。既定値は OFF です。ON
FILLFACTOR で指定される空き領域のパーセンテージが、インデックスの中間レベルのページに適用されます。PAD_INDEX を ON に設定するときに FILLFACTOR を指定しない場合は、sys.indexes に格納されている FILL FACTOR 値が使用されます。OFF または fillfactor の指定なし
中間レベルのページは、ほぼ全容量が使用されます。この場合、中間ページのキーのセットに基づき、インデックスに割り当てることのできる 1 行以上の最大サイズが収まる分の領域は残されます。
詳細については、「CREATE INDEX (Transact-SQL)」を参照してください。
FILLFACTOR = fillfactor
インデックスの作成時や変更時に、データベース エンジン が各インデックス ページのリーフ レベルをどのくらい使用するかを示すパーセンテージを指定します。fillfactor は 1 ~ 100 の整数値です。既定は 0 です。注 FILLFACTOR 値 0 と 100 の機能は、まったく同じです。
明示的な FILLFACTOR 設定値は、インデックスの初回作成時または再構築時のみ適用されます。データベース エンジンでは、ページ内で指定されたパーセント分の空領域は動的に保持されません。詳細については、「CREATE INDEX (Transact-SQL)」を参照してください。
FILL FACTOR 設定を表示するには、sys.indexes を使用します。
重要 データベース エンジンではクラスター化インデックスの作成時にデータが再分配されるため、FILLFACTOR 値を使用してクラスター化インデックスを作成または変更すると、データ用のストレージ領域のサイズに影響が生じます。
SORT_IN_TEMPDB = { ON | OFF }
tempdb に並べ替え結果を格納するかどうかを指定します。既定値は OFF です。ON
インデックス構築に使用される中間の並べ替え結果が tempdb に格納されます。tempdb がユーザー データベースとは異なるディクス セット上にある場合は、インデックスの作成に必要な時間が短縮されることがありますが、インデックスの構築中に使用されるディスク領域のサイズは増加します。OFF
中間の並べ替え結果はインデックスと同じデータベースに格納されます。
並べ替え操作が必要ない場合、または並べ替えをメモリ内で実行できる場合、SORT_IN_TEMPDB オプションは無視されます。
詳細については、「インデックスの SORT_IN_TEMPDB オプション」を参照してください。
IGNORE_DUP_KEY = { ON | OFF }
挿入操作で、一意のインデックスに重複するキーの値を挿入しようとしたときのエラー応答を指定します。IGNORE_DUP_KEY オプションは、インデックスが作成または再構築された後の挿入操作のみに適用されます。既定値は OFF です。ON
重複したキー値が一意のインデックスに挿入されると、警告メッセージが発行されます。一意性制約に違反する行のみが失敗します。OFF
重複したキー値が一意のインデックスに挿入されると、エラー メッセージが発行されます。INSERT 操作全体がロールバックされます。
ビューで作成されるインデックス、一意ではないインデックス、XML インデックス、空間インデックス、およびフィルター選択されたインデックスに対して、IGNORE_DUP_KEY は ON に設定できません。
IGNORE_DUP_KEY を表示するには、sys.indexes を使用します。
旧バージョンと互換性のある構文では、WITH IGNORE_DUP_KEY は WITH IGNORE_DUP_KEY = ON と同じです。
STATISTICS_NORECOMPUTE = { ON | OFF }
分布統計を再計算するかどうかを指定します。既定値は OFF です。ON
古い統計情報は、自動的には再計算されません。OFF
自動統計更新が有効です。
自動統計更新を復元するには、STATISTICS_NORECOMPUTE を OFF に設定するか、NORECOMPUTE 句を指定せずに UPDATE STATISTICS を実行します。
重要 分布統計の自動再計算を無効にすると、クエリ オプティマイザーで、テーブルに関連するクエリの最適実行プランが選択されなくなる場合があります。
ONLINE = { ON | OFF }
インデックス操作中に、基となるテーブルとそれに関連する各インデックスに対してクエリやデータ変更を行うことができるかどうかを指定します。既定値は OFF です。XML インデックスまたは空間インデックスの場合、ONLINE = OFF だけがサポートされます。ONLINE を ON に設定すると、エラーが発生します。
注 オンラインでのインデックス操作は、Microsoft SQL Server のすべてのエディションで使用できるわけではありません。SQL Server の各エディションでサポートされる機能の一覧については、「SQL Server 2012 の各エディションがサポートする機能」を参照してください。
ON
長期のテーブル ロックは、インデックス操作の間は保持されません。インデックス操作の主要フェーズの期間、ソース テーブルではインテント共有 (IS) ロックのみが保持されます。これによって、基になるテーブルおよびインデックスに対してクエリや更新を続けることができます。操作の開始時、非常に短い時間、ソース オブジェクトでは共有 (S) ロックが保持されます。また操作の終了時、非クラクタ化インデックスが作成される場合は、短い時間、ソース オブジェクト上で S ロックが保持されます。また、クラスター化インデックスがオンラインで作成または削除されるか、クラスター化または非クラスター化インデックスが再構築される場合は、SCH-M (スキーマ修正) ロックが取得されます。インデックスがローカル一時テーブルに作成される場合は、ONLINE を ON にできません。OFF
テーブル ロックは、インデックス操作の間適用されます。オフラインのインデックス操作で、クラスター化インデックス、空間インデックス、XML インデックスの作成、再構築、削除を行う場合や、非クラスター化インデックスの再構築、削除を行う場合は、テーブルで Sch-M (スキーマ修正) ロックが取得されます。このため、操作中は、すべてのユーザーは基になるテーブルにアクセスできません。非クラスター化インデックスを作成するオフライン インデックス操作では、テーブルの共有 (S) ロックが取得されます。この場合は、基になるテーブルに対して更新は許可されませんが、SELECT ステートメントなどの読み取り操作は許可されます。
詳細については、「オンライン インデックス操作の動作原理」を参照してください。
インデックスは、グローバル一時テーブル上のインデックスを含めてオンラインで再構築できます。ただし次のインデックスは例外です。
XML インデックス数
ローカル一時テーブル上のインデックス
パーティション インデックスのサブセット (パーティション インデックス全体の再構築はオンラインで実行できます)
ALLOW_ROW_LOCKS = { ON | OFF }
行ロックを許可するかどうかを指定します。既定値は ON です。ON
インデックスにアクセスするとき、行ロックが許可されます。いつ行ロックを使用するかは、データベース エンジンによって決定されます。OFF
行ロックは使用されません。
ALLOW_PAGE_LOCKS = { ON | OFF }
ページ ロックを許可するかどうかを指定します。既定値は ON です。ON
インデックスにアクセスするとき、ページ ロックが許可されます。いつページ ロックを使用するかは、データベース エンジンによって決定されます。OFF
ページ ロックは使用されません。
注 ALLOW_PAGE_LOCKS を OFF に設定した場合、インデックスを再構成することはできません。
MAXDOP **=**max_degree_of_parallelism
インデックス操作の間、max degree of parallelism 構成オプションをオーバーライドします。詳細については、「max degree of parallelism サーバー構成オプションの構成」を参照してください。並列プランの実行で使用されるプロセッサ数を制限するには、MAXDOP を使用します。最大数は 64 プロセッサです。重要 MAXDOP オプションはすべての XML インデックスで構文的にサポートされていますが、空間インデックスまたはプライマリ XML インデックスの場合、現在の ALTER INDEX では単一のプロセッサのみ使用されます。
max_degree_of_parallelism には次のデータを指定できます。
1
並列プランの生成を抑制します。>1
並列インデックス操作で使用される最大プロセッサ数を、指定数に制限します。0 (既定値)
現在のシステム ワークロードに基づいて、実際の数以下のプロセッサを使用します。
詳細については、「並列インデックス操作の構成」を参照してください。
注 並列インデックス操作は、Microsoft SQL Server のすべてのエディションで使用できるわけではありません。SQL Server の各エディションでサポートされる機能の一覧については、「SQL Server 2012 の各エディションがサポートする機能」を参照してください。
DATA_COMPRESSION
指定したインデックス、パーティション番号、またはパーティション範囲に、データ圧縮オプションを指定します。次のオプションがあります。NONE
インデックスまたは指定したパーティションが圧縮されません。ROW
行の圧縮を使用して、インデックスまたは指定したパーティションが圧縮されます。PAGE
ページの圧縮を使用して、インデックスまたは指定したパーティションが圧縮されます。
圧縮の詳細については、「データの圧縮」を参照してください。
ON PARTITIONS ( { <partition_number_expression> | <range> } [,...n] )
DATA_COMPRESSION 設定を適用するパーティションを指定します。インデックスがパーティション分割されていない場合に ON PARTITIONS 引数を使用すると、エラーが発生します。ON PARTITIONS 句を指定しないと、パーティション インデックスのすべてのパーティションに対して DATA_COMPRESSION オプションが適用されます。<partition_number_expression> は以下の方法で指定できます。
パーティションの番号を指定してください。例: ON PARTITIONS (2)。
複数の個別パーティションのパーティション番号を指定し、コンマで区切ってください。例: ON PARTITIONS (1, 5)。
パーティション範囲および個別パーティションの両方を指定してください: ON PARTITIONS (2, 4, 6 TO 8)。
<範囲>は TO で区切られたパーティション番号によって指定できます。例: ON PARTITIONS (6 TO 8)。
さまざまなパーティションにさまざまな種類のデータ圧縮を設定するには、次のように DATA_COMPRESSION オプションを複数回指定します。
REBUILD WITH ( DATA_COMPRESSION = NONE ON PARTITIONS (1), DATA_COMPRESSION = ROW ON PARTITIONS (2, 4, 6 TO 8), DATA_COMPRESSION = PAGE ON PARTITIONS (3, 5) )
説明
インデックスをパーティションに再分割するか別のファイル グループに移動する場合、ALTER INDEX は使用できません。このステートメントは、列の追加や削除、または列の順序変更など、インデックス定義の変更には使用できません。これらの操作を実行するには、CREATE INDEX を DROP_EXISTING 句と共に使用します。
オプションを明示的に指定しない場合は、現在の設定が適用されます。たとえば、REBUILD 句で FILLFACTOR 設定を指定しなかった場合、再構築処理では、システム カタログに格納されている FILL FACTOR 値が使用されます。現在のインデックス オプション設定を表示するには、sys.indexes を使用します。
注 |
---|
ONLINE、MAXDOP、および SORT_IN_TEMPDB の値は、システム カタログに格納されません。インデックス ステートメントでオプション値を指定しない限り、各オプションの既定値が使用されます。 |
マルチプロセッサ コンピューター上では、ALTER INDEX REBUILD は他のクエリと同様、自動的に使用プロセッサの数を増やしてインデックスの変更に関連するスキャンや並べ替え操作を実行します。LOB_COMPACTION の有無に関係なく、ALTER INDEX REORGANIZE を実行すると、max degree of parallelism の値は単一スレッドの操作になります。詳細については、「並列インデックス操作の構成」を参照してください。
インデックスのあるファイル グループがオフラインまたは読み取り専用に設定されていると、インデックスを再構成または再構築することはできません。キーワード ALL を指定した場合で、1 つ以上のインデックスがオフラインまたは読み取り専用のファイル グループにある場合、ステートメントは失敗します。
インデックスの再構築
インデックスの再構築では、インデックスを削除し再作成します。この操作では、断片化をなくし、指定されているか既に存在する FILL FACTOR 設定に基づいてページを圧縮することによりディスク領域を取り戻した後、連続するページにインデックス行を再び並べ替えます。ALL を指定した場合、テーブル上のすべてのインデックスが、1 回のトランザクションで削除され再構築されます。FOREIGN KEY 制約は、前もって削除しておく必要はありません。128 以上のエクステントがあるインデックスを再構築すると、データベース エンジンでは、トランザクションがコミットされるまで実際のページの割り当て解除とそれに関連するロックが延期されます。
小さなインデックスを再構築または再構成しても、多くの場合、断片化が解消することはありません。小さなインデックスのページは、混合エクステントに格納されます。混合エクステントは最大 8 つのオブジェクトで共有されるため、小さなインデックスを再構成または再構築しても、その断片化は解消されない場合があります。
SQL Server 2012 では、パーティション インデックスが作成または再構築された場合、テーブル内のすべての行をスキャンして統計を作成することはできません。代わりに、クエリ オプティマイザーが既定のサンプリング アルゴリズムを使用して統計を生成します。テーブル内のすべての行をスキャンしてパーティション インデックスの統計を作成するには、FULLSCAN 句で CREATE STATISTICS または UPDATE STATISTICS を使用します。
以前のバージョンの SQL Server では、非クラスター化インデックスを再構築することで、ハードウェア障害により発生した不一致を修正できる場合がありました。SQL Server 2008 以降でも、非クラスター化インデックスをオフラインで再構築することで、インデックスとクラスター化インデックス間の不一致を修正できますが、オンラインでインデックスを再構築する場合、既存の非クラスター化インデックスを基に再構築が行われるので、不一致を維持してしまい非クラスター化インデックスの不一致を修復できません。一方、オフラインでインデックスを再構築すると、クラスター化インデックス (ヒープ) のスキャンが行われ、不一致が解消されます。不一致を解消する場合、以前のバージョンと同様に影響を受けたデータをバックアップから復元することをお勧めします。ただし、非クラスター化インデックスをオフラインで再構築しても、インデックスの不一致を修復できます。詳細については、「DBCC CHECKDB (Transact-SQL)」を参照してください。
インデックスの再構成
インデックスの再構成では、最小のシステム リソースが使用されます。この操作では、リーフ レベル ページをリーフ ノードの論理順序 (左から右) に合わせて物理的に並べ替えることにより、テーブルやビュー上にあるクラスター化および非クラスター化インデックスのリーフ レベルをデフラグします。再構成により、インデックス ページの圧縮も行われます。圧縮は既存の FILL FACTOR 値に基づいて行われます。FILL FACTOR 設定を表示するには、sys.indexes を使用します。
ALL を指定した場合、テーブル上のクラスター化および非クラスター化両方のリレーショナル インデックスと XML インデックスが再構成されます。ALL を指定した場合は、いくつかの制限が適用されます。「引数」の ALL の定義を参照してください。
詳細については、「インデックスの再編成と再構築」を参照してください。
インデックスの無効化
インデックスを無効にすると、ユーザーはそのインデックスにアクセスできなくなります。クラスター化インデックスの場合は、基になるテーブルのデータにアクセスできなくなります。インデックス定義はシステム カタログに残ります。ビューの非クラスター化インデックスまたはクラスター化インデックスを無効にすると、そのインデックス データは物理的に削除されます。クラスター化インデックスを無効にすると、データにアクセスできなくなりますが、データはインデックスが削除または再構築されるまで B ツリーに残ります。このデータは管理されません。有効化または無効化されたインデックスの状態を表示するには、sys.indexes カタログ ビューの is_disabled 列にクエリを実行します。
テーブルがトランザクション レプリケーション パブリケーションに含まれている場合は、主キー列に関連付けられているインデックスを無効にすることはできません。これらのインデックスはレプリケーションで必要です。インデックスを無効にするには、最初にそのテーブルをパブリケーションから削除する必要があります。詳細については、「データとデータベース オブジェクトのパブリッシュ」を参照してください。
インデックスを有効にするには、ALTER INDEX REBUILD ステートメントまたは CREATE INDEX WITH DROP_EXISTING ステートメントを使用します。ONLINE オプションが ON に設定されていると、無効化されたクラスター化インデックスを再構築できません。詳細については、「インデックスと制約の無効化」を参照してください。
オプションの設定
特定のインデックスに対して、再構築または再構成を行わずに ALLOW_ROW_LOCKS、ALLOW_PAGE_LOCKS、IGNORE_DUP_KEY および STATISTICS_NORECOMPUTE オプションを設定できます。変更された値はすぐにインデックスに適用されます。これらの設定を表示するには、sys.indexes を使用します。詳細については、「インデックス オプションの設定」を参照してください。
行およびページ ロック オプション
ALLOW_ROW_LOCKS = ON かつ ALLOW_PAGE_LOCK = ON の場合は、インデックスにアクセスするとき、行レベル、ページ レベル、およびテーブル レベルのロックが許可されます。データベース エンジンは適切なロックを選択し、行ロックまたはページ ロックをテーブル ロックにエスカレートすることができます。
ALLOW_ROW_LOCKS = OFF かつ ALLOW_PAGE_LOCK = OFF の場合は、インデックスにアクセスするときにテーブル レベルのロックだけが許可されます。
行またはページ ロック オプションが設定されている場合に ALL を指定すると、この設定はすべてのインデックスに適用されます。基になるテーブルがヒープの場合、この設定は次のように適用されます。
ALLOW_ROW_LOCKS = ON または OFF |
ヒープおよび関連する非クラスター化インデックスに適用。 |
ALLOW_PAGE_LOCKS = ON |
ヒープおよび関連する非クラスター化インデックスに適用。 |
ALLOW_PAGE_LOCKS = OFF |
非クラスター化インデックスに完全に適用。この場合、非クラスター化インデックスではすべてのページ ロックが許可されません。ヒープでは、ページに対して共有 (S)、更新 (U) および排他 (X) ロックだけが許可されなくなります。データベース エンジンでは内部目的用にインテント ページ ロック (IS、IU または IX) を引き続き取得できます。 |
オンライン インデックス操作
インデックスを再構築する場合で ONLINE オプションが ON に設定されている場合、クエリおよびデータ変更で、基になるオブジェクト、テーブルおよび関連インデックスを使用できます。排他テーブル ロックは、変更処理中の非常に短い時間だけ保持されます。
インデックスの再構成は、常にオンラインで実行されます。この処理ではロックが長期間保持されないので、実行中のクエリや更新はブロックされません。
同じテーブルでのオンライン インデックス操作は、次を実行する場合のみ同時に実行できます。
複数の非クラスター化インデックスを作成する。
同じテーブルで異なるインデックスを再構成する。
同じテーブルで重複しないインデックスを再構築する間、別のインデックスを再構成する。
その他すべてのオンライン インデックス操作は、同時に実行しようとしても失敗します。たとえば、同じテーブル上で同時に 2 つ以上のインデックスを再構築したり、同じテーブルで既存のインデックスを再構築する間に新しいインデックスを作成することはできません。
詳細については、「オンラインでのインデックス操作の実行」を参照してください。
空間インデックスに関する制限
空間インデックスを再構築するとき、基になるユーザー テーブルはインデックス操作の間使用できなくなります。これは、空間インデックスがスキーマ ロックを保持するためです。
ユーザー テーブルの PRIMARY KEY 制約は、そのテーブルの列に空間インデックスが定義されているときは変更できません。PRIMARY KEY 制約を変更する場合は、初めにテーブルのすべての空間インデックスを削除してください。PRIMARY KEY 制約を変更した後、各空間インデックスを再作成できます。
単一のパーティションの再構築操作では、空間インデックスを指定できません。ただし、パーティションの完全な再構築では、空間インデックスを指定できます。
BOUNDING_BOX や GRID など、空間インデックス固有のオプションを変更するには、DROP_EXISTING = ON を指定する CREATE SPATIAL INDEX ステートメントを使用するか、空間インデックスを削除して新しく作成します。例については、「CREATE SPATIAL INDEX (Transact-SQL)」を参照してください。
列ストア インデックスの制限事項
REBUILD オプションを除き、xVelocity メモリ最適化列ストア インデックスは変更できません。そのため、削除して再作成する必要があります。
データの圧縮
データ圧縮の詳細については、「データの圧縮」を参照してください。
圧縮状態の変更による、テーブル、インデックス、またはパーティションへの影響を評価するには、sp_estimate_data_compression_savings ストアド プロシージャを使用します。
パーティション インデックスには次の制限が適用されます。
ALTER INDEX ALL ... を使用しても、固定されていないインデックスがテーブルにあると、そのパーティションの圧縮の設定を変更できません。
ALTER INDEX <index> ...REBUILD PARTITION ... 構文は、そのインデックスの指定のパーティションを再構築します。
ALTER INDEX <index> ...REBUILD WITH ... 構文は、そのインデックスのすべてのパーティションを再構築します。
統計
テーブルで ALTER INDEX ALL … を実行すると、インデックスに関連付けられた統計のみが更新されます。(インデックスではなく) テーブルで作成されている自動または手動の統計は更新されません。
権限
ALTER INDEX を実行するには、少なくとも、テーブルまたはビューの ALTER 権限が必要です。
使用例
A. インデックスの再構築
次の例では、Employee テーブルで単一のインデックスを再構築します。
USE AdventureWorks2012;
GO
ALTER INDEX PK_Employee_BusinessEntityID ON HumanResources.Employee
REBUILD;
GO
B. テーブル上のすべてのインデックスの再構築とオプションの指定
次の例では、キーワード ALL を指定します。この場合、テーブルに関連付けられているすべてのインデックスが再構築されます。3 つのオプションが指定されています。
USE AdventureWorks2012;
GO
ALTER INDEX ALL ON Production.Product
REBUILD WITH (FILLFACTOR = 80, SORT_IN_TEMPDB = ON,
STATISTICS_NORECOMPUTE = ON);
GO
C. LOB 圧縮を行いインデックスを再構成する
次の例では、1 つのクラスター化インデックスを再編成します。インデックスのリーフ レベルに LOB データ型が含まれているので、このステートメントではラージ オブジェクト データが含まれているすべてのページも圧縮されます。既定値が ON であるため、WITH (LOB_COMPACTION) オプションの指定は必須ではありません。
USE AdventureWorks2012;
GO
ALTER INDEX PK_ProductPhoto_ProductPhotoID ON Production.ProductPhoto
REORGANIZE ;
GO
D. インデックスにオプションを設定する
次の例では、インデックス AK_SalesOrderHeader_SalesOrderNumber にいくつかのオプションを設定します。
USE AdventureWorks2012;
GO
ALTER INDEX AK_SalesOrderHeader_SalesOrderNumber ON
Sales.SalesOrderHeader
SET (
STATISTICS_NORECOMPUTE = ON,
IGNORE_DUP_KEY = ON,
ALLOW_PAGE_LOCKS = ON
) ;
GO
E. インデックスを無効にする
次の例では、Employee テーブルで非クラスター化インデックスを無効にします。
USE AdventureWorks2012;
GO
ALTER INDEX IX_Employee_OrganizationNode ON HumanResources.Employee
DISABLE ;
GO
F. 制約を無効にする
次の例では、PRIMARY KEY インデックスを無効にすることにより PRIMARY KEY 制約を無効にします。基になるテーブルに対する FOREIGN KEY 制約は自動的に無効になり、警告メッセージが表示されます。
USE AdventureWorks2012;
GO
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department
DISABLE ;
GO
結果セットでは、次の警告メッセージが返されます。
Warning: Foreign key 'FK_EmployeeDepartmentHistory_Department_DepartmentID'
on table 'EmployeeDepartmentHistory' referencing table 'Department'
was disabled as a result of disabling the index 'PK_Department_DepartmentID'.
G. 制約を有効にする
次の例では、例 F で無効にした PRIMARY KEY および FOREIGN KEY 制約を有効にします。
PRIMARY KEY 制約は、PRIMARY KEY インデックスを再構築することにより有効にできます。
USE AdventureWorks2012;
GO
ALTER INDEX PK_Department_DepartmentID ON HumanResources.Department
REBUILD ;
GO
次に FOREIGN KEY 制約を有効にします。
ALTER TABLE HumanResources.EmployeeDepartmentHistory
CHECK CONSTRAINT FK_EmployeeDepartmentHistory_Department_DepartmentID;
GO
H. パーティション インデックスを再構築する
次の例では、パーティション インデックス IX_TransactionHistory_TransactionDate のパーティション番号 5 の単一パーティションを再構築します。
USE AdventureWorks;
GO
-- Verify the partitioned indexes.
SELECT *
FROM sys.dm_db_index_physical_stats (DB_ID(),OBJECT_ID(N'Production.TransactionHistory'), NULL , NULL, NULL);
GO
--Rebuild only partition 5.
ALTER INDEX IX_TransactionHistory_TransactionDate
ON Production.TransactionHistory
REBUILD Partition = 5;
GO
I. インデックスの圧縮設定を変更する
次の例では、非パーティション テーブルのインデックスを再構築します。
ALTER INDEX IX_INDEX1
ON T1
REBUILD
WITH ( DATA_COMPRESSION = PAGE )
GO
その他のデータの圧縮の例については、「データの圧縮」を参照してください。
関連項目
参照
CREATE SPATIAL INDEX (Transact-SQL)
CREATE XML INDEX (Transact-SQL)
sys.dm_db_index_physical_stats (Transact-SQL)