비 클러스터형 인덱스에 클러스터형 인덱스 열을 포함해야합니까?


15

비 클러스터형 인덱스가 클러스터 된 인덱스를 기반으로한다는 것을 고려할 때 비 클러스터형 인덱스가 클러스터형 인덱스에 포함 된 열을 나열해야합니까?

다시 말해 Products 테이블에 ProductID에 대한 클러스터 된 인덱스가 포함되어 있으면 ProductID 열을 포함하는 것이 좋습니다 비 클러스터형 인덱스를 만들 때 열로 추가해야합니까?

그렇지 않은 경우 비 클러스터형 인덱스에 열 이름을 추가하는 것이 좋은 시나리오가 있습니까?

답변:


20

SQL Server에서 클러스터 된 인덱스 키 열은 항상 클러스터되지 않은 인덱스에 추가 되어 행 로케이터 역할을합니다 (참조 : 클러스터되지 않은 인덱스 키에 대한 추가 정보 ).

고유 한 것으로 선언 된 NCI의 경우 포함 된 열로 추가됩니다. 그렇지 않으면 키 끝에 추가됩니다.

기본 게재 위치가 쿼리에 적합하지 않은 경우 열을 명시 적으로 추가 할 수 있습니다. 예를 들어 ASC/ DESC방향 을 제어 하거나 색인에서 키 열의 위치를 ​​제어하려는 경우.

CREATE TABLE T
(
A INT,
B INT,
C INT ,
PRIMARY KEY CLUSTERED (B DESC, C DESC)
)

/*Implicitly adds B DESC, C DESC to end of key*/
CREATE NONCLUSTERED INDEX ix1 ON T(A ASC) 

/*No sort operation*/
SELECT  *
FROM T
ORDER BY A ASC,B DESC, C DESC

/*
But the avove index won't be able to seek into A,C  
and will need a residual predicate after seeking into A.

For the following query
*/

SELECT  *
FROM T
WHERE A=1 AND C > 4
ORDER BY C ASC, B DESC

/*This index explicitly controlling the key column position 
  and direction would be better*/
CREATE NONCLUSTERED INDEX ix2 ON T(A ASC, C ASC, B DESC) 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.