オンライン インデックス操作の動作原理How Online Index Operations Work

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

このトピックでは、オンライン インデックスの操作中に存在する構造を定義し、これらの構造に関連した利用方法について説明します。This topic defines the structures that exist during an online index operation and shows the activities associated with these structures.

オンライン インデックスの構造Online Index Structures

インデックス DDL (データ定義言語) の操作中に同時ユーザー操作を可能にするために、オンライン インデックスの操作中に、ソースと既存のインデックス、ターゲット、(ヒープを再構築したりクラスター化インデックスをオンラインで削除したりする場合) 一時マッピング インデックスなどの構造が使用されます。To allow for concurrent user activity during an index data definition language (DDL) operation, the following structures are used during the online index operation: source and pre-existing indexes, target, and for rebuilding a heap or dropping a clustered index online, a temporary mapping index.

  • ソースと既存のインデックスSource and pre-existing indexes

    ソースとは、元のテーブルまたはクラスター化インデックス データです。The source is the original table or clustered index data. 既存のインデックスとは、ソース構造に関連付けられた任意の非クラスター化インデックスです。Pre-existing indexes are any nonclustered indexes that are associated with the source structure. たとえば、オンライン インデックス操作によって、関連付けられた 4 つの非クラスター化インデックスを含むクラスター化インデックスが再構築される場合、ソースは既存のクラスター化インデックスで、既存のインデックスは非クラスター化インデックスです。For example, if the online index operation is rebuilding a clustered index that has four associated nonclustered indexes, the source is the existing clustered index and the pre-existing indexes are the nonclustered indexes.

    同時実行ユーザーは、選択、挿入、更新、削除の各操作に、既存のインデックスを使用できます。The pre-existing indexes are available to concurrent users for select, insert, update, and delete operations. 既存のインデックスを使用する操作には、トリガーや参照整合性制約による、一括挿入や暗黙の更新が含まれます (一括挿入は、サポートされますが、お勧めしません)。This includes bulk inserts (supported but not recommended) and implicit updates by triggers and referential integrity constraints. クエリや検索では、すべての既存のインデックスを使用できます。All pre-existing indexes are available for queries and searches. つまり、クエリ オプティマイザーでは既存のインデックスが選択され、必要に応じて、それをインデックス ヒントに指定できます。This means they may be selected by the query optimizer and, if necessary, specified in index hints.

  • 移行先Target

    ターゲットとは、作成または再構築される、新しいインデックス (または、ヒープ) です。The target or targets is the new index (or heap) or a set of new indexes that is being created or rebuilt. ユーザーによるソースへの挿入、更新、削除の各操作は、インデックス操作中、 SQL Server データベース エンジンSQL Server Database Engine によってターゲットに適用されます。User insert, update, and delete operations to the source are applied by the SQL Server データベース エンジンSQL Server Database Engine to the target during the index operation. たとえば、オンライン インデックス操作によってクラスター化インデックスが再構築される場合、ターゲットは再構築されるクラスター化インデックスです。 データベース エンジンDatabase Engine では、クラスター化インデックスが再構築されるときは、非クラスター化インデックスは再構築されません。For example, if the online index operation is rebuilding a clustered index, the target is the rebuilt clustered index; the データベース エンジンDatabase Engine does not rebuild nonclustered indexes when a clustered index is rebuilt.

    SELECT ステートメントの処理中には、インデックス操作がコミットされるまでターゲット インデックスは検索されません。The target index is not searched while processing SELECT statements until the index operation is committed. 内部的には、インデックスは書き込み専用に設定されます。Internally, the index is marked as write-only.

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

    クラスター化インデックスを作成、削除、または再構築するオンライン インデックス操作では、一時マッピング インデックスも必要になります。Online index operations that create, drop, or rebuild a clustered index also require a temporary mapping index. 基になるテーブルの行が更新または削除されるときに、構築される新しいインデックスのどのレコードを削除するかを決めるために、同時実行トランザクションによってこの一時インデックスが使用されます。This temporary index is used by concurrent transactions to determine which records to delete in the new indexes that are being built when rows in the underlying table are updated or deleted. 新しいクラスター化インデックス (またはヒープ) と同じ手順で、この非クラスター化インデックスが作成されます。また、個別の並べ替え操作は必要ありません。This nonclustered index is created in the same step as the new clustered index (or heap) and does not require a separate sort operation. 同時実行トランザクションでは、挿入、更新、削除の各操作のすべての一時マッピング インデックスもメンテナンスされます。Concurrent transactions also maintain the temporary mapping index in all their insert, update, and delete operations.

オンライン インデックスでの処理Online Index Activities

インデックスが設定されていないテーブル (ヒープ) にクラスター化インデックスを作成する場合など、単純なオンライン インデックス操作中は、ソースとターゲットは準備、構築、最終工程の 3 つのフェーズで処理されます。During a simple online index operation, such as creating a clustered index on a nonindexed table (heap), the source and target go through three phases: preparation, build, and final.

次の図に、初期クラスター化インデックスをオンラインで作成する処理を示します。The following illustration shows the process for creating an initial clustered index online. ソース オブジェクト (ヒープ) には、他のインデックスはありません。The source object (the heap) has no other indexes. 各フェーズでのソースとターゲットの利用状況が示されています。また、同時実行ユーザーによる選択、挿入、更新、削除の各操作についても示されています。The source and target structure activities are shown for each phase; concurrent user select, insert, update, and delete operations are also shown. 準備、構築、最終工程の各フェーズは、フェーズで使用されるロック モードと共に示されています。The preparation, build, and final phases are indicated together with the lock modes used in each phase.

オンライン インデックスの操作中に行われる処理Activities performed during online index operation

ソース構造での処理Source Structure Activities

次の表に、インデックス操作と対応するロック操作の各フェーズ中に、ソース構造に関係する処理を一覧します。The following table lists the activities involving the source structures during each phase of the index operation and the corresponding locking strategy.

フェーズPhase ソースでの処理Source activity ソースのロックSource locks
準備Preparation

短いフェーズShort phase
新しい空のインデックス構造を作成するための、システム メタデータの準備。System metadata preparation to create the new empty index structure.

テーブルのスナップショットが定義されます。A snapshot of the table is defined. つまり、トランザクションレベルの読み取りの一貫性を提供するために、行のバージョン管理が使用されます。That is, row versioning is used to provide transaction-level read consistency.

短期間、ソース上での同時実行ユーザーの書き込み操作がブロックされます。Concurrent user write operations on the source are blocked for a short period.

複数の非クラスター化インデックスの作成を除き、同時実行 DDL 操作は許可されません。No concurrent DDL operations are allowed except creating multiple nonclustered indexes.
テーブルで S (共有) *S (Shared) on the table*

IS (インテント共有)IS (Intent Shared)

INDEX_BUILD_INTERNAL_RESOURCE**INDEX_BUILD_INTERNAL_RESOURCE**
ビルドBuild

メイン フェーズMain phase
一括読み込み操作で、データのスキャン、並べ替え、マージが行われ、ターゲットに挿入されます。The data is scanned, sorted, merged, and inserted into the target in bulk load operations.

同時実行ユーザーの選択、挿入、更新、削除の各操作は、既存のインデックスと新しく構築されるインデックスの両方に適用されます。Concurrent user select, insert, update, and delete operations are applied to both the pre-existing indexes and any new indexes being built.
ISIS

INDEX_BUILD_INTERNAL_RESOURCE**INDEX_BUILD_INTERNAL_RESOURCE**
最終工程Final

短いフェーズShort phase
コミットされていないすべての更新トランザクションは、このフェーズが始まる前に完了している必要があります。All uncommitted update transactions must complete before this phase starts. 取得したロックによっては、このフェーズが完了するまでの短期間、新しいユーザーによる読み取りトランザクションや書き込みトランザクションはすべてブロックされます。Depending on the acquired lock, all new user read or write transactions are blocked for a short period until this phase is completed.

ソースをターゲットに置き換えるために、システム メタデータが更新されます。System metadata is updated to replace the source with the target.

必要に応じて、ソースが削除されます。The source is dropped if it is required. たとえば、クラスター化インデックスを再構築したり、削除した後などにはソースが削除されます。For example, after rebuilding or dropping a clustered index.
INDEX_BUILD_INTERNAL_RESOURCE**INDEX_BUILD_INTERNAL_RESOURCE**

非クラスター化インデックスを作成する場合、テーブルで S。*S on the table if creating a nonclustered index.*

ソース構造 (インデックスやテーブル) が削除される場合、SCH-M (スキーマ変更)。*SCH-M (Schema Modification) if any source structure (index or table) is dropped.*

* インデックス操作は、テーブルに S ロックまたは SCH-M ロックを取得する前に、コミットされていない更新トランザクションが完了するまで待機します。* The index operation waits for any uncommitted update transactions to complete before acquiring the S lock or SCH-M lock on the table.

** リソース ロック INDEX_BUILD_INTERNAL_RESOURCE により、インデックス操作の実行中に、ソースと既存の各構造で同時実行 DDL (データ定義言語) 操作を実行できなくなります。** The resource lock INDEX_BUILD_INTERNAL_RESOURCE prevents the execution of concurrent data definition language (DDL) operations on the source and pre-existing structures while the index operation is in progress. たとえばこのロックにより、同じテーブルで 2 つのインデックスの再構築を同時実行できなくなります。For example, this lock prevents concurrent rebuild of two indexes on the same table. このリソース ロックは Sch-M ロックと関連付けられていますが、データ操作ステートメントを実行できなくすることはできません。Although this resource lock is associated with the Sch-M lock, it does not prevent data manipulation statements.

上記の表は、1 つのインデックスに関係するオンライン インデックス操作の構築フェーズ中に 1 つの共有 (S) ロックが取得されることを示しています。The previous table shows a single Shared (S) lock acquired during the build phase of an online index operation that involves a single index. クラスター化インデックスや非クラスター化インデックスが構築されるときは、構築フェーズ中に 1 つのオンライン インデックス操作 (たとえば、1 つ以上の非クラスター化インデックスを含むテーブルでの最初のクラスター化インデックスの作成中など) で、短期間 2 つの共有 (S) ロックが取得された後、長期間インテント共有 (IS) ロックが取得されます。When clustered and nonclustered indexes are built, or rebuilt, in a single online index operation (for example, during the initial clustered index creation on a table that contains one or more nonclustered indexes) two short-term S locks are acquired during the build phase followed by long-term Intent Shared (IS) locks. 最初に、クラスター化インデックスの作成のために 1 つの S ロックが取得され、クラスター化インデックスの作成完了時に、非クラスター化インデックスの作成のために 2 番目の S ロックが短期間取得されます。One S lock is acquired first for the clustered index creation and when creating the clustered index is completed, a second short-term S lock is acquired for creating the nonclustered indexes. 非クラスター化インデックスが作成された後、オンライン インデックス操作の最終フェーズまで、S ロックが IS ロックにダウングレードされます。After the nonclustered indexes are created, the S lock is downgraded to an IS lock until the final phase of the online index operation.

ターゲット構造での処理Target Structure Activities

次の表に、インデックス操作と対応するロック操作の各フェーズ中に、ターゲット構造に関係する処理を一覧します。The following table lists the activities that involve the target structure during each phase of the index operation and the corresponding locking strategy.

フェーズPhase ターゲットでの処理Target activity ターゲットのロックTarget locks
準備Preparation 新しいインデックスが作成され、書き込み専用に設定されます。New index is created and set to write-only. ISIS
ビルドBuild ソースからデータが挿入されます。Data is inserted from source.

ソースに適用されたユーザーの変更 (挿入、更新、削除) が適用されます。User modifications (inserts, updates, deletes) applied to the source are applied.

この処理は、ユーザーが意識することはありません。This activity is transparent to the user.
ISIS
最終工程Final インデックス メタデータが更新されます。Index metadata is updated.

インデックスが、読み取りと書き込みが可能な状態に設定されます。Index is set to read/write status.
SS

内の複数のor

SCH-MSCH-M

インデックス操作が完了するまでは、ユーザーによって実行された SELECT ステートメントがターゲットにアクセスすることはありません。The target is not accessed by SELECT statements issued by the user until the index operation is completed.

準備フェーズと最終工程フェーズが完了した後は、プロシージャ キャッシュに格納されたクエリ プランと更新プランは無効になります。After the preparation and final phase is completed, the query and update plans that are stored in the procedure cache are invalidated. 後続のクエリでは、新しいインデックスが使用されます。Subsequent queries use the new index.

オンライン インデックス操作に関係するテーブルで宣言されたカーソルの有効期間は、オンライン インデックス フェーズによって制限されます。The lifetime of a cursor declared on a table that is involved in an online index operation is limited by the online index phases. 更新カーソルは各フェーズで無効になります。Update cursors are invalidated at each phase. 読み取り専用カーソルは、最終工程フェーズの後にのみ無効になります。Read-only cursors are invalidated only after the final phase.

オンラインでのインデックス操作の実行Perform Index Operations Online

オンライン インデックス操作のガイドラインGuidelines for Online Index Operations