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