포괄 열을 사용하여 인덱스 만들기
SQL Server 2005 에서는 인덱스 키 열과 함께 키가 아닌 열을 포함하여 비클러스터형 인덱스를 확장할 수 있습니다. 키가 아닌 열은 인덱스 B-트리의 리프 수준에 저장됩니다.
키가 아닌 열을 포함하는 인덱스는 쿼리를 처리할 때 가장 큰 장점을 제공합니다. 이는 쿼리에서 참조되는 모든 열을 인덱스에 포함할 수 있음을 의미합니다. 자세한 내용은 포괄 열이 있는 인덱스를 참조하십시오.
디스크 공간 요구 사항
키가 아닌 열을 인덱스에 추가하면 인덱스를 저장하는 데 더 많은 공간이 사용됩니다. 특히, varchar(max), nvarchar(max), varbinary(max) 또는 xml 데이터 형식을 키가 아닌 열로 추가하면 열 값이 인덱스 리프 수준에 복사되고 테이블이나 클러스터링 인덱스에도 남아 있게 되어 디스크 공간 요구 사항이 크게 늘어납니다.
포괄 열이 있는 인덱스에 대한 디스크 공간 요구 사항을 결정하는 과정은 비클러스터형 인덱스의 경우와 동일합니다. 자세한 내용은 인덱스 디스크 공간 요구 사항 확인을 참조하십시오.
성능 고려 사항
쿼리 최적화 프로그램이 테이블이나 클러스터형 인덱스에 액세스하지 않고도 필요한 열 데이터를 인덱스 내에서 모두 찾을 수 있으므로 SELECT 작업에서 성능이 향상됩니다. 그러나 포괄 열이 너무 많으면 인덱스 유지 관리 작업이 많아져 기본 테이블이나 인덱싱된 뷰에 대한 삽입, 업데이트 또는 삭제 작업에 필요한 시간이 늘어납니다.
예
1. 쿼리 처리
다음 예는 Person.Address
테이블에 포괄 열 4개를 사용하여 비클러스터형 인덱스를 만듭니다. 인덱스 키 열은 PostalCode
이고 키가 아닌 열은 AddressLine1, AddressLine2, City,``StateProvinceID
입니다.
USE AdventureWorks;
GO
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO
다음 쿼리는 지정한 인덱스 조건으로 처리됩니다.
SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN '98000' and '99999';
GO
2. 인덱스 크기 제한 초과
다음 예에서 CREATE INDEX 문의 INCLUDE 절은 주로 키 열의 크기가 최대값인 900바이트를 초과하는 열을 인덱싱하는 데 사용됩니다. Production.ProductReview
테이블에는 ProductID``(int)
, ReviewerName
, (nvarchar (50))
및 Comments (nvarchar (3850))
열이 있습니다. 이 세 열은 쿼리에서 자주 사용되지만 Comments
열은 인덱스 키 열로 참가하기에는 너무 큽니다. 이 경우 INCLUDE
절을 사용하여 Comments
열을 키가 아닌 열로 인덱스에 추가할 수 있습니다.
USE AdventureWorks;
GO
CREATE NONCLUSTERED INDEX IX_ProductReview_ProductID_ReviewerName
ON Production.ProductReview (ProductID, ReviewerName)
INCLUDE (Comments);
GO
다음 쿼리는 지정한 인덱스 조건으로 처리됩니다.
SELECT Comments
FROM Production.ProductReview
WHERE ProductID = 937;
GO