オンラインでインデックス操作を実行する場合のガイドライン

インデックス操作をオンラインで実行するときは、次のガイドラインに従ってください。

  • 基になるテーブルに image、ntext、text、varchar(max)、nvarchar(max)、varbinary(max)、xml などの LOB (ラージ オブジェクト) データ型が含まれている場合、クラスタ化インデックスの作成、再構築、または削除は、オフラインで行う必要があります。

  • テーブルに LOB データ型が含まれていても、そのデータ型の列がキー列または非キー (付加) 列としてインデックス定義で使用されていない場合は、一意ではない非クラスタ化インデックスをオンラインで作成できます。LOB データ型の列を使用して定義されている非クラスタ化インデックスの作成や再構築は、オフラインで行う必要があります。

  • ローカル一時テーブルのインデックスの作成、再構築、または削除は、オンラインでは実行できません。この制限は、グローバル一時テーブルのインデックスには当てはまりません。

注意注意

オンラインでのインデックス操作は、SQL Server Enterprise Edition、Developer Edition、および Evaluation Edition でのみ使用できます。

次の表に、オンラインで実行可能なインデックス操作と、これらのオンライン操作対象から除外されるインデックスを示します。また、その他の制限についても記載します。

オンラインのインデックス操作

操作対象外のインデックス

その他の制限事項

ALTER INDEX REBUILD

無効化されたクラスタ化インデックスまたは無効化されたインデックス付きビュー

XML インデックス

ローカル一時テーブルのインデックス

テーブルに操作対象外のインデックスが含まれている場合、キーワード ALL を指定すると操作が失敗する可能性があります。

無効化されたインデックスの再構築には、他にも制限があります。詳細については、「インデックスを無効にする場合のガイドライン」を参照してください。

CREATE INDEX

XML インデックス

ビューの最初の一意クラスタ化インデックス

ローカル一時テーブルのインデックス

 

CREATE INDEX WITH DROP_EXISTING

無効化されたクラスタ化インデックスまたは無効化されたインデックス付きビュー

ローカル一時テーブルのインデックス

XML インデックス

 

DROP INDEX

無効化されたインデックス

XML インデックス

非クラスタ化インデックス

ローカル一時テーブルのインデックス

1 つのステートメント内に複数のインデックスは指定できません。

ALTER TABLE ADD CONSTRAINT (PRIMARY KEY または UNIQUE)

ローカル一時テーブルのインデックス

クラスタ化インデックス

副句は、一度に 1 つしか使用できません。たとえば、同じ ALTER TABLE ステートメント内で PRIMARY KEY 制約または UNIQUE 制約を追加して削除することはできません。

ALTER TABLE DROP CONSTRAINT (PRIMARY KEY または UNIQUE)

クラスタ化インデックス

 

オンラインのインデックス操作の実行中は、基になるテーブルを変更、切り捨て、または削除できません。

クラスタ化インデックスの作成または削除時に指定したオンライン オプションの設定 (ON または OFF) は、再構築する必要のある非クラスタ化インデックスに適用されます。たとえば、クラスタ化インデックスが CREATE INDEX WITH DROP_EXISTING, ONLINE=ON を使用してオンラインで構築される場合、関連するすべての非クラスタ化インデックスも、オンラインで再作成されます。

UNIQUE インデックスをオンラインで作成または再構築するときに、インデックス ビルダと同時実行ユーザー トランザクションが、同じキーの挿入を試み、一意性が損なわれる場合があります。ソース テーブルの元の行が新しいインデックス (ターゲット) に移動される前に、ユーザーが入力した行が新しいインデックスに挿入されると、オンラインのインデックス操作が失敗します。

ユーザーやアプリケーションの作業によっては、オンラインのインデックス操作とデータベースの更新が連携して実行される場合、まれに、オンラインのインデックス操作によりデッドロックが発生する場合があります。このようなまれなケースでは、SQL Server データベース エンジンにより、ユーザーやアプリケーションの作業がデッドロックの対象として選択されます。

複数の新しい非クラスタ化インデックスを作成しているとき、または非クラスタ化インデックスを再構成しているときに限り、同じテーブルやビューに対してインデックス DDL 操作をオンラインで同時実行できます。その他のオンラインのインデックス操作はすべて、同時実行できません。たとえば、既存のインデックスをオンラインで再構築している間に、同じテーブルの新しいインデックスをオンラインで作成することはできません。

ディスク領域に関する注意点

基本的に、オンラインとオフラインのインデックス操作間で、必要なディスク領域に違いはありません。一時マッピング インデックスに追加のディスク領域が必要になる場合だけは例外です。この一時インデックスは、クラスタ化インデックスを作成、再構築、または削除する、オンライン インデックス操作で使用されます。クラスタ化インデックスをオンラインで削除する場合と、クラスタ化インデックスをオンラインで作成する場合は同じ量の領域が必要になります。詳細については、「インデックス DDL 操作に必要なディスク領域」を参照してください。

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

オンラインのインデックス操作では、同時実行ユーザーによる更新操作は許可されていますが、その更新操作の負荷が非常に高いと、インデックス操作の処理時間が長くなります。通常、オンラインのインデックス操作は、同時実行更新操作の負荷レベルに関係なく、同じインデックス操作をオフラインで行った場合よりも時間がかかります。

オンラインのインデックス操作中は、ソースの構造とターゲットの構造の両方が保持されるため、挿入、更新、削除のトランザクションによるリソースの使用量は、最大 2 倍にまで増加する場合があります。このため、インデックス操作中のパフォーマンスが低下し、リソースの使用量 (特に CPU 使用時間) が増大する可能性があります。オンラインでのインデックス操作は、完全にログに記録されます。

オンラインでの操作を推奨しますが、実際の環境と特定の要件を評価してください。オフラインでインデックス操作を実行することが最適な場合もあります。この場合、操作中にユーザーからのデータ アクセスは制限されますが、操作をより短時間で完了でき、使用するリソースも軽減できます。

SQL Server Enterprise を実行するマルチプロセッサ コンピュータでは、他のクエリと同様に、インデックスのステートメントがこのステートメントに関連付けられているスキャン操作や並べ替え操作の実行に、より多くのプロセッサを使用する場合があります。MAXDOP インデックス オプションを使用して、オンラインでのインデックス操作専用に使用するプロセッサ数を制御できます。このようにすることで、インデックス操作が使用するリソースと他の同時実行ユーザーが使用するリソースのバランスをとることができます。詳細については、「並列インデックス操作の構成」を参照してください。

S-Lock または Sch-M ロックはインデックス操作の最後のフェーズで保持されるので、BEGIN TRANSACTION...COMMIT ブロックなど、明示的なユーザー トランザクション内でのオンラインのインデックス操作を実行する場合は十分に注意してください。この場合、ロックがトランザクションの最後まで保持され、その結果ユーザーの同時実行性が損なわれます。

トランザクション ログに関する注意点

オフライン、オンラインを問わず、大規模なインデックス操作を行うと、大量のデータ読み込みが発生し、トランザクション ログがすぐにいっぱいになってしまうことがあります。インデックス操作をロールバックできるようにするため、インデックス操作が完了するまでは、トランザクション ログを切り捨てることはできません。ただし、インデックス操作中にログをバックアップすることはできます。したがって、トランザクション ログには、インデックス操作中にインデックス操作によるトランザクションと、同時実行ユーザーによるトランザクションの両方を格納できるだけの十分な領域が割り当てられている必要があります。詳細については、「インデックス操作用のトランザクション ログのディスク領域」を参照してください。