インデックス操作をオンラインで実行するときは、次のガイドラインに従ってください。
基になるテーブルに次のラージ オブジェクト (LOB) データ型 (
image、 ntext、text) が含まれている場合は、クラスター化インデックスを作成、再構築、またはオフラインで削除する必要があります。ローカル一時テーブルのインデックスをオンラインで作成、再構築、または削除することはできません。 この制限は、グローバル一時テーブルのインデックスには適用されません。
注
オンライン インデックス操作は、MicrosoftSQL Server のすべてのエディションで使用できるわけではありません。 SQL Server の各エディションでサポートされる機能の一覧については、「SQL Server 2014 の各エディションでサポートされる機能」を参照してください。
次の表は、オンラインで実行できるインデックス操作と、これらのオンライン操作から除外されるインデックスを示しています。 追加の制限も含まれています。
| オンライン インデックス操作 | 除外されたインデックス | その他の制限事項 |
|---|---|---|
| ALTER INDEX REBUILD (これはインデックスを再構築するためのSQLコマンドです) | 無効なクラスター化インデックスまたは無効なインデックス付きビュー XML インデックス 列ストア インデックス ローカル一時テーブルのインデックス |
キーワード ALL を指定すると、テーブルに除外インデックスが含まれている場合に操作が失敗する可能性があります。 無効なインデックスの再構築に関する追加の制限が適用されます。 詳細については、「 インデックスと制約を無効にする」を参照してください。 |
| インデックスを作成 | XML インデックス ビューの最初の一意クラスター化インデックス ローカル一時テーブルのインデックス |
|
| インデックスを作成し、既存を削除する | 無効なクラスター化インデックスまたは無効なインデックス付きビュー ローカル一時テーブルのインデックス XML インデックス |
|
| インデックス削除 | 無効なインデックス XML インデックス 非クラスター化インデックス ローカル一時テーブルのインデックス |
1 つのステートメント内で複数のインデックスを指定することはできません。 |
| テーブルを変更し、制約を追加 (主キーまたはユニーク) | ローカル一時テーブルのインデックス クラスター化したインデックス |
一度に許可されるサブクラウズは 1 つだけです。 たとえば、同じ ALTER TABLE ステートメントで PRIMARY KEY 制約または UNIQUE 制約を追加および削除することはできません。 |
オンライン インデックス操作の実行中に、基になるテーブルを変更、切り捨て、または削除することはできません。
クラスター化インデックスを作成または削除するときに指定されたオンライン オプション設定 (ON または OFF) は、再構築する必要がある非クラスター化インデックスに適用されます。 たとえば、CREATE INDEX WITH DROP_EXISTING ONLINE=ON を使用してクラスター化インデックスがオンラインで構築されている場合、関連付けられているすべての非クラスター化インデックスもオンラインで再作成されます。
UNIQUE インデックスをオンラインで作成または再構築すると、インデックス ビルダーと同時ユーザー トランザクションが同じキーを挿入しようとする可能性があるため、一意性に違反する可能性があります。 ソース テーブルの元の行が新しいインデックスに移動される前に、ユーザーが入力した行を新しいインデックス (ターゲット) に挿入すると、オンライン インデックス操作は失敗します。
一般的ではありませんが、オンライン インデックス操作は、ユーザーまたはアプリケーションのアクティビティが原因でデータベースの更新と対話するときにデッドロックを引き起こす可能性があります。 このようなまれなケースでは、SQL Server データベース エンジンによって、デッドロックの対象としてユーザーまたはアプリケーション アクティビティが選択されます。
複数の新しい非クラスター化インデックスを作成する場合、または非クラスター化インデックスを再構成する場合にのみ、同じテーブルまたはビューに対して同時にオンライン インデックス DDL 操作を実行できます。 同時に実行されたその他のオンライン インデックス操作はすべて失敗します。 たとえば、同じテーブルで既存のインデックスをオンラインで再構築するときに、新しいインデックスをオンラインで作成することはできません。
インデックスにラージ オブジェクト型の列が含まれており、同じトランザクションでこのオンライン操作の前に更新操作がある場合は、オンライン操作を実行できません。 この問題を回避するには、オンライン操作をトランザクションの外部に配置するか、トランザクション内の更新の前に配置します。
ディスク領域に関する考慮事項
一般に、ディスク領域の要件は、オンラインとオフラインのインデックス操作で同じです。 例外は、一時マッピング インデックスに必要な追加のディスク領域です。 この一時インデックスは、クラスター化インデックスを作成、再構築、または削除する、オンライン インデックス操作で使用されます。 クラスター化インデックスをオンラインで削除するには、クラスター化インデックスをオンラインで作成するのと同じ量の領域が必要です。 詳細については、「 インデックス DDL 操作のディスク領域の要件」を参照してください。
パフォーマンスに関する考慮事項
オンライン インデックス操作では同時ユーザー更新アクティビティが許可されますが、更新アクティビティが非常に多い場合、インデックス操作には時間がかかります。 通常、オンライン インデックス操作は、同時更新アクティビティ レベルに関係なく、同等のオフライン インデックス操作よりも遅くなります。
ソース構造とターゲット構造の両方がオンライン インデックス操作中に維持されるため、挿入、更新、および削除トランザクションのリソース使用量が増加し、最大で 2 倍になる可能性があります。 これにより、インデックス操作中にパフォーマンスが低下し、特に CPU 時間が長くなる可能性があります。 オンライン インデックス操作は完全にログに記録されます。
オンライン操作をお勧めしますが、環境と特定の要件を評価する必要があります。 インデックス操作をオフラインで実行するのが最適な場合があります。 この操作では、ユーザーは操作中にデータへのアクセスを制限できますが、操作はより速く完了し、使用するリソースが少なくなります。
SQL Server 2014 を実行しているマルチプロセッサ コンピューターでは、他のクエリと同様に、インデックス ステートメントでより多くのプロセッサを使用して、インデックス ステートメントに関連付けられたスキャン操作と並べ替え操作を実行できます。 MAXDOP インデックス オプションを使用して、オンライン インデックス操作専用のプロセッサの数を制御できます。 この方法では、インデックス操作で使用されるリソースと同時実行ユーザーのリソースのバランスを取ることができます。 詳細については、「 並列インデックス操作の構成」を参照してください。 並列インデックス付き操作をサポートする SQL Server のエディションの詳細については、「 SQL Server 2014 の各エディションでサポートされる機能」を参照してください。
S ロックまたは Sch-M ロックはインデックス操作の最終フェーズで保持されるため、「BEGIN TRANSACTION...COMMIT」といった明示的なユーザー トランザクション内でオンライン インデックス操作を実行するときは注意してください。 この場合、ロックがトランザクションの最後まで保持され、その結果ユーザーのコンカレンシーが損なわれます。
オンライン インデックスの再構築では、 MAX DOP > 1 オプションと ALLOW_PAGE_LOCKS = OFF オプションを使用して実行できる場合、断片化が増える可能性があります。 詳細については、「 しくみ: オンライン インデックスの再構築 - 断片化の増加を引き起こす可能性があります」を参照してください。
トランザクション ログに関する考慮事項
オフライン、オンラインを問わず、大規模なインデックス操作を行うと、大量のデータ読み込みが発生し、トランザクション ログがすぐにいっぱいになってしまうことがあります。 インデックス操作を確実にロールバックできるようにするには、インデックス操作が完了するまでトランザクション ログを切り捨てることはできません。ただし、ログはインデックス操作中にバックアップできます。 したがって、トランザクション ログには、インデックス操作中にインデックス操作によるトランザクションと、同時実行ユーザーによるトランザクションの両方を格納できるだけの十分な領域が割り当てられている必要があります。 詳細については、「 インデックス操作のトランザクション ログ ディスク領域」を参照してください。