인덱스 키의 최대 크기
키 열이 많거나 크기가 큰 열을 포함하는 인덱스를 디자인할 경우 최대 인덱스 키 크기를 초과하지 않도록 인덱스 키 크기를 계산해야 합니다. SQL Server에서는 모든 인덱스 키 열의 총 크기가 900바이트를 넘지 않아야 합니다. 비클러스터형 인덱스 정의에 포함된 키가 아닌 열에는 이 제한이 적용되지 않습니다.
인덱스 키 크기 계산
인덱스 키 크기를 계산하려면 다음 단계를 따릅니다.
인덱스의 기반이 될 테이블 열의 속성을 표시합니다. 이 작업은 sys.columns 카탈로그 뷰를 사용하여 수행할 수 있습니다.
인덱스 키에 정의될 각 열의 길이를 더합니다.
예를 들어 다음 문은 Person.Address 테이블에 지정된 열에 대한 sys.columns 카탈로그 뷰의 max_length 열을 집계합니다.
USE AdventureWorks2008R2; GO SELECT SUM(max_length)AS TotalIndexKeySize FROM sys.columns WHERE name IN (N'AddressLine1', N'AddressLine2', N'City', N'StateProvinceID', N'PostalCode') AND object_id = OBJECT_ID(N'Person.Address');
[!참고]
테이블 열이 nchar이나 nvarchar과 같은 유니코드 데이터 형식인 경우 표시된 열 길이는 열의 저장 길이입니다. 이 값은 CREATE TABLE 문에 지정된 문자 수의 두 배입니다. 위의 예에서 City는 nvarchar(30) 데이터 형식으로 정의되므로 이 열의 저장 길이는 60입니다.
총 길이가 900바이트보다 작으면 열을 인덱스 키 열로 사용할 수 있습니다. 총 길이가 900바이트를 넘으면 다음 옵션 정보를 검토하여 다른 방법을 시도합니다.
CREATE INDEX 문은 다음 알고리즘을 사용하여 인덱스 키 크기를 계산합니다.
모든 고정 키 열의 크기에 CREATE INDEX 문에 지정된 모든 변수 키 열의 최대 크기를 더한 크기가 900바이트보다 작은 경우 CREATE INDEX 문은 경고나 오류 없이 성공적으로 완료됩니다.
모든 고정 키 열의 크기에 모든 변수 키 열의 최대 크기를 더한 크기가 900을 초과하지만 모든 고정 키 열의 크기에 변수 키 열의 최소 크기를 더한 크기가 900보다 작으면 CREATE INDEX 문은 900바이트보다 더 큰 키 값을 생성하는 값을 지정할 경우 후속 INSERT 또는 UPDATE 문이 실패할 수 있다는 경고를 나타내며 성공적으로 실행됩니다. 테이블의 기존 데이터 행이 900바이트보다 큰 키를 생성하는 값을 포함할 경우 CREATE INDEX 문은 실패합니다. 900바이트보다 긴 키 값을 생성하는 데이터 값을 지정하는 후속 INSERT 또는 UPDATE 문은 실패합니다.
모든 고정 키 열의 크기에 CREATE INDEX 문에서 지정된 모든 변수 열의 최소 크기를 더한 크기가 900바이트보다 크면 CREATE INDEX 문은 실패합니다.
다음 표에서는 최대 인덱스 키 크기 제한을 충족하거나 초과하는 인덱스 만들기의 결과를 요약해서 보여 줍니다.
가변 길이 열의 최소 크기 + 고정 데이터 열의 크기 |
가변 길이 열의 최대 크기 + 고정 데이터 열의 크기 |
기존 행의 인덱스 키 열 길이 합계의 최대값* |
인덱스 생성 여부 |
메시지 유형 |
너무 큰 인덱스 키 값으로 인해 발생하는 INSERT 또는 UPDATE 런타임 오류 |
---|---|---|---|---|---|
> 900바이트 |
해당 없음 |
해당 없음 |
아니요 |
오류 |
오류를 생성하는 인덱스가 없음 |
<= 900바이트 |
<= 900바이트 |
해당 없음 |
예 |
없음 |
아니요 |
<= 900바이트 |
> 900바이트 |
<= 900바이트 |
예 |
경고 |
모든 인덱스 열의 현재 길이의 합계가 900바이트보다 큰 경우에만 해당 |
<= 900바이트 |
> 900바이트 |
> 900바이트 |
아니요 |
오류 |
오류를 생성하는 인덱스가 없음 |
* CREATE INDEX 문이 실행될 때 테이블의 어떠한 행도 전체 길이가 900바이트를 초과하는 인덱스 키 값을 포함할 수 없습니다.
크기 제한을 피하기 위한 포괄 열 사용
현재 인덱스 크기가 최대 16개의 키 열 및 최대 900바이트의 인덱스 키로 제한되지 않도록 비클러스터형 인덱스에 키가 아닌 열을 포함할 수 있습니다. SQL Server 데이터베이스 엔진은 인덱스 키 열 수나 인덱스 키 열의 총 크기를 계산할 때 키가 아닌 열은 포함하지 않습니다. 포괄 열이 있는 비클러스터형 인덱스에서 인덱스 키 열의 총 크기는 900바이트로 제한되지만 키가 아닌 모든 열의 전체 크기는 INCLUDE 절에 지정된 열의 크기에 의해서만 제한됩니다. 예를 들어 varchar(max) 열은 2GB로 제한됩니다. INCLUDE 절에는 text, ntext 및 image 를 제외한 모든 데이터 형식의 열이 포함될 수 있습니다.
[!참고]
테이블이 분할되어 있는 경우 분할 키 열이 비고유 클러스터형 인덱스에 없으면 데이터베이스 엔진이 분할 키 열을 해당 인덱스에 추가합니다. 인덱싱된 열(포함된 열 제외)과 추가된 분할 열을 합한 크기는 비고유 클러스터형 인덱스에서 1,800바이트를 초과할 수 없습니다.