온라인 인덱스 작동 방식
이 항목에서는 온라인 인덱스 작업 중에 존재하는 구조에 대해 설명하고 이러한 구조와 관련된 작업을 보여 줍니다.
온라인 인덱스 구조
인덱스 DDL(데이터 정의 언어) 작업 중에 동시 사용자 작업이 가능하도록 하려면 온라인 인덱스 작업 중에 원본 및 기존 인덱스, 대상 및 임시 매핑 인덱스(힙을 다시 작성하거나 클러스터형 인덱스를 온라인으로 삭제하는 경우) 구조를 사용합니다.
원본 및 기존 인덱스
원본은 원래 테이블이거나 클러스터형 인덱스 데이터입니다. 기존 인덱스는 원본 구조와 관련된 모든 비클러스터형 인덱스입니다. 예를 들어 온라인 인덱스 작업이 네 개의 관련 비클러스터형 인덱스가 있는 클러스터형 인덱스를 재구성하는 것이라면 원본은 기존 클러스터형 인덱스이고 기존 인덱스는 비클러스터형 인덱스입니다.
기존 인덱스는 여러 사용자의 동시 선택, 삽입, 업데이트 및 삭제 작업에 사용됩니다. 여기에는 대량 삽입(지원되지만 권장하지 않음)과 트리거 및 참조 무결성 제약 조건에 의한 암시적 업데이트가 포함됩니다. 쿼리와 검색에 모든 기존 인덱스를 사용할 수 있습니다. 즉, 기존 인덱스를 쿼리 최적화 프로그램에서 선택할 수 있으며 필요한 경우 인덱스 힌트에 지정할 수 있습니다.
대상
대상은 만들거나 다시 작성하는 새 인덱스(또는 힙)이거나 새 인덱스 집합입니다. SQL Server 데이터베이스 엔진에서는 인덱스 작업을 수행하는 동안 원본에 대한 사용자 삽입, 업데이트 및 삭제 작업을 대상에 적용합니다. 예를 들어 온라인 인덱스 작업이 클러스터형 인덱스를 다시 작성하는 것이라면 대상은 다시 작성되는 클러스터형 인덱스입니다. 데이터베이스 엔진에서는 클러스터형 인덱스를 다시 작성할 때 비클러스터형 인덱스를 다시 작성하지 않습니다.
대상 인덱스는 인덱스 작업이 커밋될 때까지 SELECT 문을 처리하는 동안 검색되지 않습니다. 내부적으로 인덱스가 쓰기 전용으로 표시됩니다.
임시 매핑 인덱스
클러스터형 인덱스를 만들거나 삭제하거나 다시 작성하는 온라인 인덱스 작업에는 임시 매핑 인덱스도 필요합니다. 이러한 임시 인덱스는 동시 트랜잭션이 기본 테이블의 행이 업데이트되거나 삭제될 때 작성되는 새 인덱스에서 삭제할 레코드를 결정하는 데 사용합니다. 이러한 비클러스터형 인덱스는 새 클러스터형 인덱스(또는 힙)와 같은 단계에서 만들어지므로 별도의 정렬 작업이 필요 없습니다. 동시 트랜잭션의 모든 삽입, 업데이트 및 삭제 작업에서도 임시 매핑 인덱스가 유지됩니다.
온라인 인덱스 작업
비클러스터형 테이블(힙)에서 클러스터형 인덱스를 만드는 것과 같은 단순 온라인 인덱스 작업 중에는 원본 및 대상이 준비, 작성, 최종의 세 단계를 거치게 됩니다.
다음 그림에서는 온라인 상태에서 초기 클러스터형 인덱스를 만드는 과정을 보여 줍니다. 원본 개체(힙)에는 다른 인덱스가 없습니다. 그림에는 원본 및 대상 구조와 관련된 각 단계의 작업과 동시 사용자 선택, 삽입, 업데이트 및 삭제 작업이 표시되어 있습니다. 준비, 작성 및 최종 단계는 각 단계에 사용되는 잠금 모드와 함께 표시됩니다.
원본 구조 작업
다음 표에서는 인덱스 작업의 각 단계에서 원본 구조와 관련된 작업과 해당 잠금 전략에 대해 설명합니다.
단계 |
원본 작업 |
원본 잠금 |
---|---|---|
준비 매우 짧은 단계 |
비어 있는 새 인덱스 구조를 만들 시스템 메타데이터 준비 테이블 스냅숏이 정의됩니다. 즉, 트랜잭션 수준의 읽기 일관성을 제공하기 위해 행 버전 관리가 사용됩니다. 매우 짧은 기간 동안 원본에 대한 동시 사용자 쓰기 작업이 차단됩니다. 여러 개의 비클러스터형 인덱스 만들기를 제외한 동시 DDL 작업이 허용되지 않습니다. |
테이블에 대한 S(공유)* IS(내재된 공유) INDEX_BUILD_INTERNAL_RESOURCE** |
작성 주 단계 |
대량 로드 작업의 대상으로 데이터가 검색, 정렬, 병합 및 삽입됩니다. 동시 사용자 선택, 삽입, 업데이트 및 삭제 작업이 기존 인덱스와 작성된 모든 새 인덱스에 적용됩니다. |
IS INDEX_BUILD_INTERNAL_RESOURCE** |
최종 매우 짧은 단계 |
이 단계를 시작하기 전에 커밋되지 않은 모든 업데이트 트랜잭션이 완료되어야 합니다. 획득한 잠금에 따라 이 단계가 완료될 때까지 매우 짧은 기간 동안 새로운 사용자 읽기 또는 쓰기 트랜잭션이 모두 차단됩니다. 시스템 메타데이터가 업데이트되어 원본이 대상으로 대체됩니다. 필요한 경우 원본이 삭제됩니다. 예를 들어 클러스터형 인덱스를 다시 작성하거나 삭제하면 원본이 삭제됩니다. |
INDEX_BUILD_INTERNAL_RESOURCE** 비클러스터형 인덱스를 만드는 경우 테이블에 대한 S* 원본 구조(인덱스 또는 테이블)가 삭제되는 경우 SCH-M(스키마 수정)* |
* 인덱스 작업은 커밋되지 않은 모든 업데이트 트랜잭션이 완료될 때까지 대기한 후 테이블에 대한 S 잠금이나 SCH-M 잠금을 획득합니다.
** 리소스 잠금 INDEX_BUILD_INTERNAL_RESOURCE는 인덱스 작업이 진행 중인 동안 원본과 기존 구조에 대한 동시 DDL(데이터 정의 언어) 작업이 실행되지 못하게 합니다. 예를 들어 이 잠금으로 인해 동일한 테이블에 대한 두 인덱스를 동시에 다시 작성할 수 없습니다. 이 리소스 잠금은 Sch-M 잠금과 연관되지만 이 리소스 잠금으로 인해 데이터 조작 문이 실행되지 않는 것은 아닙니다.
위의 표에서는 단일 인덱스를 포함하는 온라인 인덱스 작업의 작성 단계 중에 획득되는 단일 공유(S) 잠금을 보여 줍니다. 하나 이상의 비클러스터형 인덱스를 포함하는 테이블에 대한 초기 클러스터형 인덱스를 만드는 경우와 같이 클러스터형 인덱스와 비클러스터형 인덱스를 작성하거나 다시 작성하는 경우에는 먼저 단기 S 잠금 두 개가 획득된 후 장기 IS(내재된 공유) 잠금이 획득됩니다. 먼저 클러스터형 인덱스 작성에 대한 S 잠금을 획득하고 클러스터형 인덱스 작성이 완료되면 비클러스터형 인덱스 작성을 위한 두 번째 단기 S 잠금을 획득합니다. 비클러스터형 인덱스가 작성된 후 온라인 인덱스 작업의 최종 단계까지 S 잠금이 IS 잠금으로 다운그레이드됩니다.
대상 구조 작업
다음 표에서는 인덱스 작업의 각 단계에서 대상 구조와 관련된 작업과 해당 잠금 전략에 대해 설명합니다.
단계 |
대상 작업 |
대상 잠금 |
---|---|---|
준비 |
새 인덱스가 작성되고 쓰기 전용으로 설정됩니다. |
IS |
빌드 |
원본의 데이터가 삽입됩니다. 원본에 적용된 사용자 수정 사항(삽입, 업데이트, 삭제)이 적용됩니다. 사용자는 이 작업을 인식하지 못합니다. |
IS |
최종 |
인덱스 메타데이터가 업데이트됩니다. 인덱스가 읽기/쓰기 상태로 설정됩니다. |
S 또는 SCH-M |
인덱스 작업이 완료될 때까지 사용자가 실행한 SELECT 문은 대상에 액세스할 수 없습니다.
준비 및 최종 단계가 완료되면 프로시저 캐시에 저장되어 있는 쿼리 및 업데이트 계획이 무효화됩니다. 이후의 쿼리에서는 새 인덱스를 사용합니다.
온라인 인덱스 작업과 관련된 테이블에 선언되어 있는 커서의 수명은 온라인 인덱스 단계로 제한됩니다. 각 단계에서 업데이트 커서가 무효화됩니다. 읽기 전용 커서는 최종 단계 이후에만 무효화됩니다.