次の方法で共有


オンライン インデックス操作のしくみ

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceMicrosoft Fabric プレビューの SQL データベース

この記事では、オンライン インデックス操作中に存在する構造体を定義し、これらの構造体に関連付けられているアクティビティを示します。

オンライン インデックス構造

インデックス データ定義言語 (DDL) 操作中の同時ユーザー アクティビティを可能にするために、オンライン インデックス操作中に、ソースと既存のインデックス、ターゲット、ヒープの再構築、またはオンラインでのクラスター化インデックスの削除、一時的なマッピング インデックスの構造が使用されます。

  • ソースインデックスと既存のインデックス

    ソースとは、元のテーブルまたはクラスター化インデックス データです。 既存のインデックスは、ソース構造に関連付けられている非クラスター化インデックスです。 たとえば、オンライン インデックス操作で、4 つの非クラスター化インデックスが関連付けられたクラスター化インデックスを再構築する場合、ソースは既存のクラスター化インデックスであり、既存のインデックスは非クラスター化インデックスです。

    既存のインデックスは、同時ユーザーが選択、挿入、更新、および削除の操作に使用できます。 これには、一括挿入 (オンライン インデックス操作中にサポートされますが推奨されません) や、トリガーと参照整合性制約による暗黙的な更新が含まれます。 クエリでは、既存のすべてのインデックスを使用できます。 これは、クエリ オプティマイザーによって選択され、必要に応じてインデックス ヒントで指定される可能性があることを意味します。

  • Target

    ターゲットとは、作成または再構築される、新しいインデックス (または、ヒープ) です。 ソースへのユーザーの挿入、更新、および削除操作は、インデックス操作中にデータベース エンジンによってターゲットに適用されます。 たとえば、オンライン インデックス操作でクラスター化インデックスを再構築する場合、ターゲットは再構築されたクラスター化インデックスです。データベース エンジンは、クラスター化インデックスの再構築時に非クラスター化インデックスを再構築しません。

    ターゲット インデックスは、インデックス操作がコミットされるまで使用されません。 内部的には、インデックスは書き込み専用に設定されます。

  • 一時マッピング インデックス

    クラスター化インデックスを作成、削除、または再構築するオンライン インデックス操作では、一時マッピング インデックスも必要になります。 この一時インデックスは、ソース テーブル内の行が更新または削除されたときに作成される新しいインデックスで削除するレコードを決定するために、同時実行トランザクションによって使用されます。 この非クラスター化インデックスは、新しいクラスター化インデックス (またはヒープ) と同じ手順で作成され、個別の並べ替え操作は必要ありません。 同時実行トランザクションでは、挿入、更新、および削除のすべての操作で一時的なマッピング インデックスが維持されます。

オンライン インデックス アクティビティ

インデックスのないテーブル (ヒープ) にクラスター化インデックスを作成するなどのオンライン インデックス操作中、ソースとターゲットは、準備、ビルド、最終の 3 つのフェーズを実行します。

progress_report_online_index_operation拡張イベントを使用して、オンライン インデックス操作の進行状況を監視できます。

次の図に、初期クラスター化インデックスをオンラインで作成する処理を示します。 ソース オブジェクト (ヒープ) には、他のインデックスはありません。 ソースとターゲットの構造アクティビティは、フェーズごとに表示されます。同時ユーザー SELECTINSERTUPDATE、および DELETE 操作も表示されます。 準備、構築、最終工程の各フェーズは、フェーズで使用されるロック モードと共に示されています。

オンライン インデックス操作中に実行されたアクティビティを示す図。

ソース構造の活動

次の表に、インデックス操作と対応するロック操作の各フェーズ中に、ソース構造に関係する処理を一覧します。

Phase Source activity Source locks
Preparation

Short phase
新しい空のインデックス構造を作成するための、システム メタデータの準備。

テーブルのスナップショットが定義されます。 つまり、トランザクションレベルの読み取りの一貫性を提供するために、行のバージョン管理が使用されます。

短期間、ソース上での同時実行ユーザーの書き込み操作がブロックされます。

複数の非クラスター化インデックスの作成を除き、同時実行 DDL 操作は許可されません。
S の共有 ()

意図共有 (IS)

リソース サブタイプINDEX_OPERATION2のスキーマ変更(Sch-M)におけるオブジェクト ロック
Build

Main phase
データは、一括読み込み操作によってスキャンされ、並べ替えられ、マージされ、ターゲットに挿入されます。

同時実行ユーザー INSERTUPDATEDELETE、および MERGE 操作は、既存のインデックスと、構築されている新しいインデックスの両方に適用されます。
意図共有 (IS)

Sch-Mリソース サブタイプINDEX_OPERATION2のオブジェクト ロック
Final

Short phase
コミットされていない書き込みトランザクションはすべて、このフェーズを開始する前に完了する必要があります。 取得したロックに応じて、このフェーズが完了するまで、新しいユーザーのすべての読み取りまたは書き込みトランザクションが短時間ブロックされます。

ソースをターゲットに置き換えるために、システム メタデータが更新されます。

クラスター化インデックスの再構築または削除後など、必要に応じてソースが削除されます。
Sch-Mリソース サブタイプ INDEX_OPERATION2 を持つオブジェクト ロック

非クラスター化インデックスを作成する場合は、テーブルで共有 (S)。1

Sch-M ソース構造 (インデックスまたはテーブル) が削除された場合。1

1 インデックス操作は、コミットされていない書き込みトランザクションが完了するまで待機してから、テーブルの S ロックまたは Sch-M ロックを取得します。 実行時間の長いクエリが発生すると、オンライン インデックス操作は、クエリが完了するまで待機します。 優先順位の低いロックを使用しない限り、ブロック チェーンを形成する可能性があります。

2 リソース サブタイプSch-Mを持つINDEX_OPERATION オブジェクト ロックを使用すると、インデックス操作の進行中にソースおよび既存の構造体に対して同時データ定義言語 (DDL) 操作を実行できなくなります。 たとえばこのロックにより、同じテーブルで 2 つのインデックスの再構築を同時実行できなくなります。 これは Sch-M ロックですが、データ操作ステートメントを防ぐわけではありません。

前の表は、1 つのインデックスを含むオンライン インデックス操作のビルド フェーズ中に取得された 1 つの共有 (S) ロックを示しています。 クラスター化インデックスと非クラスター化インデックスが 1 つのオンライン インデックス操作 (たとえば、1 つ以上の非クラスター化インデックスを含むテーブルでの初期クラスター化インデックスの作成中など) で構築または再構築されると、ビルド フェーズ中に 2 つの短期的な S ロックが取得され、その後に長期の意図共有 (IS) ロックが取得されます。 クラスター化インデックスを作成するために、最初に 1 つの S ロックが取得されます。 クラスター化インデックスが作成されると、非クラスター化インデックスを作成するための 2 つ目の短期的な S ロックが取得されます。 非クラスター化インデックスが作成されると、オンライン インデックス操作の最終フェーズまで、 S ロックは IS ロックにダウングレードされます。

ロックの使用方法とその管理方法の詳細については、 オンライン インデックス操作のWAIT_AT_LOW_PRIORITYに関するページを参照してください。

ターゲット構造アクティビティ

次の表に、インデックス操作と対応するロック操作の各フェーズ中に、ターゲット構造に関係する処理を一覧します。

Phase Target activity Target locks
Preparation 新しいインデックスが作成され、書き込み専用に設定されます。 意図共有 (IS)
Build ソースからデータが挿入されます。

ソースに適用されたユーザーの変更 (挿入、更新、削除) もターゲットに適用されます。

この処理は、ユーザーが意識することはありません。
意図共有 (IS)
Final インデックス メタデータが更新されます。

インデックスは読み取り/書き込み状態に設定されます。
共有 (S) またはスキーマの変更 (Sch-M)

インデックス操作が完了するまで、ターゲットはユーザー クエリによってアクセスされません。

準備または最終フェーズが完了すると、プラン キャッシュに格納されているクエリ プランが無効になる可能性があります。

オンライン インデックス操作に関係するテーブルで宣言されたカーソルの有効期間は、オンライン インデックス フェーズによって制限されます。 更新カーソルは各フェーズで無効になります。 読み取り専用カーソルは、最終工程フェーズの後にのみ無効になります。