온라인 인덱스 작동 방식
적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance
이 항목에서는 온라인 인덱스 작업 중에 존재하는 구조에 대해 설명하고 이러한 구조와 관련된 작업을 보여 줍니다.
온라인 인덱스 구조
인덱스 DDL(데이터 정의 언어) 작업 중에 동시 사용자 작업이 가능하도록 하려면 온라인 인덱스 작업 중에 원본 및 기존 인덱스, 대상 및 임시 매핑 인덱스(힙을 다시 작성하거나 클러스터형 인덱스를 온라인으로 삭제하는 경우) 구조를 사용합니다.
원본 및 기존 인덱스
원본은 원래 테이블이거나 클러스터형 인덱스 데이터입니다. 기존 인덱스는 원본 구조와 연결된 비클러스터형 인덱스입니다. 예를 들어 온라인 인덱스 작업이 4개의 연결된 비클러스터형 인덱스가 있는 클러스터형 인덱스를 다시 빌드하는 경우 원본은 기존 클러스터형 인덱스이고 기존 인덱스는 비클러스터형 인덱스입니다.
기존 인덱스는 동시 사용자가 선택, 삽입, 업데이트 및 삭제 작업에 사용할 수 있습니다. 여기에는 대량 삽입(지원되지만 권장하지 않음)과 트리거 및 참조 무결성 제약 조건에 의한 암시적 업데이트가 포함됩니다. 모든 기존 인덱스는 쿼리 및 검색에 사용할 수 있습니다. 즉, 기존 인덱스를 쿼리 최적화 프로그램에서 선택할 수 있으며 필요한 경우 인덱스 힌트에 지정할 수 있습니다.
대상
대상은 새 인덱스(또는 힙) 또는 만들거나 다시 작성 중인 새 인덱스 집합입니다. 원본에 대한 사용자 삽입, 업데이트 및 삭제 작업은 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 문에 의해 액세스되지 않습니다.
준비 및 최종 단계가 완료되면 프로시저 캐시에 저장되어 있는 쿼리 및 업데이트 계획이 무효화됩니다. 이후의 쿼리에서는 새 인덱스를 사용합니다.
온라인 인덱스 작업과 관련된 테이블에 선언된 커서의 수명은 온라인 인덱스 단계에 의해 제한됩니다. 각 단계에서 업데이트 커서가 무효화됩니다. 읽기 전용 커서는 최종 단계 후에만 무효화됩니다.