온라인 인덱스 작동 방식How Online Index Operations Work

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터)예Azure SQL Database아니요Azure SQL Data Warehouse아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure 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 preexisting indexes, target, and for rebuilding a heap or dropping a clustered index online, a temporary mapping index.

  • 원본 및 기존 인덱스Source and preexisting indexes

    원본은 원래 테이블이거나 클러스터형 인덱스 데이터입니다.The source is the original table or clustered index data. 기존 인덱스는 원본 구조와 관련된 모든 비클러스터형 인덱스입니다.Preexisting indexes are any nonclustered indexes that are associated with the source structure. 예를 들어 온라인 인덱스 작업이 네 개의 관련 비클러스터형 인덱스가 있는 클러스터형 인덱스를 재구성하는 것이라면 원본은 기존 클러스터형 인덱스이고 기존 인덱스는 비클러스터형 인덱스입니다.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 preexisting indexes are the nonclustered indexes.

    기존 인덱스는 여러 사용자의 동시 선택, 삽입, 업데이트 및 삭제 작업에 사용됩니다.The preexisting 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 preexisting 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

비클러스터형 테이블(힙)에서 클러스터형 인덱스를 만드는 것과 같은 단순 온라인 인덱스 작업 중에는 원본 및 대상이 준비, 작성, 최종의 세 단계를 거치게 됩니다.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

매우 짧은 단계Very 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 very 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 preexisting indexes and any new indexes being built.
ISIS

INDEX_BUILD_INTERNAL_RESOURCEINDEX_BUILD_INTERNAL_RESOURCE
최종Final

매우 짧은 단계Very 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 very 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_RESOURCEINDEX_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 will wait 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 preexisting structures while the index operation is in progress. 예를 들어 이 잠금으로 인해 동일한 테이블에 대한 두 인덱스를 동시에 다시 작성할 수 없습니다.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.

위의 표에서는 단일 인덱스를 포함하는 온라인 인덱스 작업의 작성 단계 중에 획득되는 단일 공유(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. 하나 이상의 비클러스터형 인덱스를 포함하는 테이블에 대한 초기 클러스터형 인덱스를 만드는 경우와 같이 클러스터형 인덱스와 비클러스터형 인덱스를 작성하거나 다시 작성하는 경우에는 먼저 단기 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. 먼저 클러스터형 인덱스 작성에 대한 S 잠금을 획득하고 클러스터형 인덱스 작성이 완료되면 비클러스터형 인덱스 작성을 위한 두 번째 단기 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 will 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