분할 인덱스에 대한 특수 지침
분할된 인덱스는 기본 테이블에 독립적으로 구현할 수도 있지만 분할된 테이블을 디자인한 다음 이 테이블에 인덱스를 만드는 것이 일반적입니다. 분할된 인덱스를 이와 같이 구현하는 경우 SQL Server에서는 테이블에 사용된 것과 같은 파티션 구성표와 분할 열을 통해 인덱스가 자동으로 분할됩니다. 그 결과 인덱스는 테이블과 기본적으로 동일한 방식으로 분할됩니다. 따라서 인덱스는 테이블에 맞게 정렬되는 것입니다.
사용자가 인덱스를 만들 때 다른 파티션 구성표를 지정하거나 인덱스를 넣을 별도의 파일 그룹을 지정하면 SQL Server에서 테이블에 맞게 인덱스가 정렬되지 않습니다.
분할된 테이블에 맞게 인덱스를 정렬하는 것은 나중에 파티션을 추가로 확장하려 하거나 잦은 파티션 전환이 필요한 경우에 특히 중요합니다. 자세한 내용은 파티션을 디자인하여 데이터 하위 집합 관리을 참조하십시오. 테이블과 인덱스가 정렬되면 SQL Server에서 테이블과 인덱스의 파티션 구조를 유지하면서 신속하고 효율적으로 파티션을 전환할 수 있습니다.
[!참고]
인덱스가 기본 테이블에 맞게 정렬되기 위해 반드시 같은 이름의 파티션 함수를 사용할 필요는 없습니다. 그러나 인덱스와 기본 테이블의 파티션 함수는 1) 파티션 함수의 인수가 동일한 데이터 형식이어야 하고 2) 정의되는 파티션 수가 같아야 하고 3) 동일한 파티션 경계 값이 정의되어야 한다는 점에서 기본적으로 동일합니다.
데이터베이스 엔진 튜닝 관리자의 튜닝 옵션 탭의 정렬된 분할 설정을 통해 새로운 권장 인덱스를 기본 테이블에 정렬되도록 지정할 수 있습니다. 정렬된 분할 유지 설정도 같은 용도로 사용할 수 있으며 정렬되지 않은 기존 인덱스를 삭제하는 데도 사용할 수 있습니다. 자세한 내용은 데이터베이스 엔진 튜닝 관리자(튜닝 옵션 탭)를 참조하십시오. 일반적으로 데이터베이스 엔진 튜닝 관리자에서 권장 인덱스를 구현함으로써 성능을 높일 수 있으며 이러한 권장 인덱스는 정렬된 인덱스와 정렬되지 않은 인덱스가 혼합될 수 있습니다. 자세한 내용은 데이터베이스 엔진 튜닝 관리자 개요를 참조하십시오.
다음과 같은 경우에는 분할된 인덱스를 기본 테이블에 독립적으로(정렬하지 않고) 디자인하는 것이 유용할 수 있습니다.
기본 테이블이 분할되지 않은 경우
인덱스 키가 고유하고 테이블의 분할 열을 포함하고 있지 않은 경우
기본 테이블이 다른 조인 열을 사용하여 추가 테이블과의 콜러케이션된 조인에 참여하도록 하려는 경우
[!참고]
파티션 전환을 사용하려면 테이블의 모든 인덱스가 정렬되어야 합니다.
분할된 인덱스를 만들 때는 다음 섹션의 내용을 고려하십시오.
고유 인덱스 분할
고유 인덱스(클러스터형 또는 비클러스터형)를 분할하는 경우에는 고유 인덱스 키에 사용된 분할 열 중에서 열을 선택해야 합니다.
[!참고]
이러한 제한을 통해 SQL Server에서는 하나의 파티션만 조사하여 새로운 키 값이 기존 테이블에 있는 키 값과 중복되지 않았는지 확인할 수 있습니다.
고유 키에 분할 열을 포함할 수 없는 경우 대신 DML 트리거를 사용하여 고유성을 적용해야 합니다.
클러스터형 인덱스 분할
클러스터형 인덱스를 분할하는 경우 클러스터링 키에 분할 열이 포함되어야 합니다. 고유하지 않은 클러스터형 인덱스를 분할하는 경우 분할 열이 클러스터링 키에 명시적으로 지정되어 있지 않으면 SQL Server에서 분할 열이 클러스터형 인덱스 키 목록에 기본적으로 추가됩니다. 클러스터형 인덱스가 고유하면 클러스터형 인덱스 키에 분할 열이 포함되도록 명시적으로 지정해야 합니다.
비클러스터형 인덱스 분할
고유한 비클러스터형 인덱스를 분할하는 경우 인덱스 키에 분할 열이 포함되어야 합니다. 고유하지 않은 비클러스터형 인덱스를 분할하는 경우에는 SQL Server에서 기본적으로 분할 열이 키가 아닌(포함된) 인덱스 열로 추가되어 인덱스가 기본 테이블에 맞게 정렬됩니다. 이미 인덱스에 분할 열이 있으면 분할 열이 인덱스에 추가되지 않습니다.
메모리 제한 사항 및 분할된 인덱스
메모리 제한 사항은 분할된 인덱스를 작성하는 SQL Server의 성능 또는 기능에 영향을 줄 수 있습니다. 이러한 제한 사항은 이미 테이블에 정렬된 클러스터형 인덱스가 있고 인덱스가 기본 테이블 또는 클러스터형 인덱스에 맞게 정렬되지 않은 경우에 크게 영향을 줍니다.
SQL Server에서 정렬을 수행하여 분할된 인덱스를 작성할 때는 먼저 파티션마다 하나씩 정렬 테이블을 만듭니다. 그런 다음 각 파티션에 있는 각각의 파일 그룹에 정렬 테이블을 만들거나 SORT_IN_TEMPDB 인덱스 옵션이 지정된 경우 tempdb에 정렬 테이블을 만듭니다.
각 정렬 테이블을 만드는 데는 최소 메모리 크기가 요구됩니다. 기본 테이블에 맞게 정렬된 분할된 인덱스를 작성할 때는 정렬 테이블이 한 번에 하나씩 만들어지므로 메모리가 적게 소모됩니다. 그러나 정렬되지 않은 분할된 인덱스를 작성할 때는 모든 정렬 테이블이 동시에 만들어집니다.
따라서 이러한 동시 정렬을 처리하기에 충분한 메모리 양이 필요하게 됩니다. 파티션의 수가 많을수록 필요한 메모리 양은 늘어납니다. 파티션별 각 정렬 테이블의 최소 크기는 40페이지이며 페이지당 8KB의 용량이 필요합니다. 예를 들어 정렬되지 않은 분할된 인덱스의 파티션 수가 100개이면 4,000(40*100)페이지를 동시에 연속적으로 정렬하기에 충분한 메모리 양이 필요합니다. 메모리가 충분하면 인덱스 작성 작업을 수행할 수 있지만 성능이 저하될 수 있습니다. 메모리가 충분하지 않으면 작성 작업을 수행할 수 없습니다. 반면 정렬된 분할된 인덱스의 경우 파티션 수가 100개라도 정렬 작업이 동시에 수행되지 않으므로 40페이지를 정렬하기에 충분한 메모리만 있으면 됩니다.
SQL Server가 다중 프로세서 컴퓨터에서 작성 작업을 수행할 때 병렬 처리 수준을 적용하면 정렬된 인덱스와 정렬되지 않은 인덱스 모두 메모리 요구 사항이 더 커질 수 있습니다. 이는 병렬 처리 수준이 높을수록 메모리 요구 사항이 커지기 때문입니다. 예를 들어 SQL Server에서 병렬 처리 수준을 4로 설정하면 파티션 수가 100개인 정렬되지 않은 분할된 인덱스의 경우 4개의 프로세서에서 4,000페이지(16,000페이지)를 동시에 정렬하는 데 충분한 메모리 크기가 필요하게 됩니다. 분할된 인덱스가 정렬되어 있는 경우에는 4개의 프로세서에서 40페이지, 즉 160페이지(4*40)를 정렬할 수 있는 메모리 크기만 있으면 됩니다. 병렬 처리 수준은 MAXDOP 인덱스 옵션을 사용하여 수동으로 낮출 수 있습니다. 자세한 내용은 병렬 인덱스 작업 구성을 참조하십시오.
인덱스를 작성할 때 SQL Server에서 정렬 작업을 수행하는 방법은 tempdb 및 인덱스 만들기를 참조하십시오.