다음을 통해 공유


인덱스 키의 최대 크기

키 열이 많거나 크기가 큰 열을 포함하는 인덱스를 디자인할 경우 최대 인덱스 키 크기를 초과하지 않도록 인덱스 키 크기를 계산해야 합니다. SQL Server에서는 모든 인덱스 키 열의 총 크기가 900바이트를 넘지 않아야 합니다. 비클러스터형 인덱스 정의에 포함된 키가 아닌 열에는 이 제한이 적용되지 않습니다.

인덱스 키 크기 계산

인덱스 키 크기를 계산하려면 다음 단계를 따릅니다.

  1. 인덱스의 기반이 될 테이블 열의 속성을 표시합니다. 이 작업은 sys.columns 카탈로그 뷰를 사용하여 수행할 수 있습니다.

  2. 인덱스 키에 정의될 각 열의 길이를 더합니다.

    예를 들어 다음 문은 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입니다.

  3. 총 길이가 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바이트를 초과할 수 없습니다.