このトピックでは、オンライン インデックス操作中に存在する構造体を定義し、これらの構造体に関連付けられているアクティビティを示します。
オンライン インデックス構造
インデックス データ定義言語 (DDL) 操作中の同時ユーザー アクティビティを可能にするために、オンライン インデックス操作中に、ソースと既存のインデックス、ターゲット、ヒープの再構築、またはオンラインでのクラスター化インデックスの削除、一時的なマッピング インデックスの構造が使用されます。
ソースインデックスと既存のインデックス
ソースは、元のテーブルまたはクラスター化インデックス データです。 既存のインデックスは、ソース構造に関連付けられている非クラスター化インデックスです。 たとえば、オンライン インデックス操作で、4 つの非クラスター化インデックスが関連付けられたクラスター化インデックスを再構築する場合、ソースは既存のクラスター化インデックスであり、既存のインデックスは非クラスター化インデックスです。
既存のインデックスは、同時ユーザーが選択、挿入、更新、および削除の操作に使用できます。 これには、一括挿入 (サポートされていますが推奨されません) や、トリガーと参照整合性制約による暗黙的な更新が含まれます。 既存のすべてのインデックスは、クエリと検索で使用できます。 これは、クエリ オプティマイザーによって選択され、必要に応じてインデックス ヒントで指定されることを意味します。
ターゲット
ターゲットは、新しいインデックス (またはヒープ) または作成または再構築される新しいインデックスのセットです。 ソースへのユーザーの挿入、更新、および削除操作は、インデックス操作中に SQL Server データベース エンジンによってターゲットに適用されます。 たとえば、オンライン インデックス操作でクラスター化インデックスを再構築する場合、ターゲットは再構築されたクラスター化インデックスです。データベース エンジンは、クラスター化インデックスの再構築時に非クラスター化インデックスを再構築しません。
SELECT ステートメントの処理中、インデックス操作がコミットされるまで、ターゲット インデックスは検索されません。 内部的には、インデックスは書き込み専用としてマークされます。
一時マッピング インデックス
クラスター化インデックスを作成、削除、または再構築するオンライン インデックス操作には、一時的なマッピング インデックスも必要です。 この一時インデックスは、基になるテーブル内の行が更新または削除されたときに作成される新しいインデックスで削除するレコードを決定するために、同時実行トランザクションによって使用されます。 この非クラスター化インデックスは、新しいクラスター化インデックス (またはヒープ) と同じ手順で作成され、個別の並べ替え操作は必要ありません。 同時トランザクションでは、挿入、更新、および削除のすべての操作で一時的なマッピング インデックスも保持されます。
オンライン インデックス アクティビティ
インデックスのないテーブル (ヒープ) にクラスター化インデックスを作成するなど、単純なオンライン インデックス操作中に、ソースとターゲットは、準備、ビルド、最終の 3 つのフェーズを実行します。
次の図は、初期クラスター化インデックスをオンラインで作成するプロセスを示しています。 ソース オブジェクト (ヒープ) に他のインデックスはありません。 ソースとターゲットの構造アクティビティは、フェーズごとに表示されます。同時ユーザーの選択、挿入、更新、および削除操作も表示されます。 準備フェーズ、ビルド フェーズ、および最終フェーズは、各フェーズで使用されるロック モードと共に示されます。
ソース構造アクティビティ
次の表に、インデックス操作の各フェーズにおけるソース構造に関連するアクティビティと、対応するロック戦略を示します。
| フェーズ | ソース アクティビティ | ソースのロック |
|---|---|---|
| 準備 非常に短いフェーズ |
新しい空のインデックス構造を作成するためのシステム メタデータの準備。 テーブルのスナップショットが定義されています。 つまり、行のバージョン管理は、トランザクション レベルの読み取り整合性を提供するために使用されます。 ソースに対する同時ユーザー書き込み操作は、非常に短い期間ブロックされます。 複数の非クラスター化インデックスを作成する場合を除き、DDL の同時実行操作は許可されません。 |
テーブル上の S (共有) * IS (意図共有) INDEX_BUILD_INTERNAL_RESOURCE** |
| 建築する メイン フェーズ |
データはスキャン、並べ替え、マージされ、一括読み込み操作でターゲットに挿入されます。 同時実行ユーザーの選択、挿入、更新、および削除操作は、既存のインデックスと、構築中の新しいインデックスの両方に適用されます。 |
です INDEX_BUILD_INTERNAL_RESOURCE** |
| 最終段階 非常に短いフェーズ |
コミットされていない更新トランザクションはすべて、このフェーズを開始する前に完了する必要があります。 取得したロックに応じて、このフェーズが完了するまで、すべての新しいユーザー読み取りまたは書き込みトランザクションが非常に短い期間ブロックされます。 ソースをターゲットに置き換えるために、システム メタデータが更新されます。 必要な場合、ソースは削除されます。 たとえば、クラスター化インデックスを再構築または削除した後などです。 |
インデックス構築内部リソース** 非クラスター化インデックスを作成する場合は、テーブル上のS。 ソース構造 (インデックスまたはテーブル) が削除された場合の SCH-M (スキーマの変更)。* |
* インデックス操作は、コミットされていない更新トランザクションが完了するのを待ってから、テーブルに S ロックまたは SCH-M ロックを取得します。
** リソース ロック INDEX_BUILD_INTERNAL_RESOURCEは、インデックス操作の進行中にソースおよび既存の構造体に対する同時実行データ定義言語 (DDL) 操作の実行を防止します。 たとえば、このロックにより、同じテーブルで 2 つのインデックスが同時に再構築されるのを防ぐことができます。 このリソース ロックは Sch-M ロックに関連付けられていますが、データ操作ステートメントは防止されません。
前の表は、1 つのインデックスを含むオンライン インデックス操作のビルド フェーズ中に取得された 1 つの共有 (S) ロックを示しています。 クラスター化インデックスと非クラスター化インデックスが 1 つのオンライン インデックス操作 (たとえば、1 つ以上の非クラスター化インデックスを含むテーブルでの最初のクラスター化インデックスの作成中) で構築または再構築されると、ビルド フェーズ中に 2 つの短期的な S ロックが取得され、その後に長期的なインテント共有 (IS) ロックが適用されます。 クラスター化インデックスの作成のために最初に 1 つの S ロックが取得され、クラスター化インデックスの作成が完了すると、非クラスター化インデックスを作成するための 2 つ目の短期的な S ロックが取得されます。 非クラスター化インデックスが作成されると、オンライン インデックス操作の最終フェーズまで S ロックが IS ロックにダウングレードされます。
ターゲット構造アクティビティ
次の表に、インデックス操作の各フェーズでターゲット構造を含むアクティビティと、対応するロック戦略を示します。
| フェーズ | ターゲット アクティビティ | ターゲット ロック |
|---|---|---|
| 準備 | 新しいインデックスが作成され、書き込み専用に設定されます。 | です |
| 建築する | ソースからデータが挿入されます。 ソースに適用されたユーザーの変更 (挿入、更新、削除) が適用されます。 このアクティビティはユーザーに対して透過的です。 |
です |
| 最終段階 | インデックス メタデータが更新されます。 インデックスは読み取り/書き込み状態に設定されます。 |
S 又は SCH-M |
ターゲットは、インデックス操作が完了するまでユーザーによって発行された SELECT ステートメントによってアクセスされません。
準備と最終フェーズが完了すると、プロシージャ キャッシュに格納されているクエリ プランと更新プランが無効になります。 後続のクエリでは、新しいインデックスが使用されます。
オンライン インデックス操作に関係するテーブルで宣言されたカーソルの有効期間は、オンライン インデックス フェーズによって制限されます。 更新カーソルは各フェーズで無効になります。 読み取り専用カーソルは、最終フェーズの後にのみ無効になります。