É necessário incluir colunas de índice em cluster em índices não em cluster?

15

Considerando que um índice não agrupado em cluster é baseado no índice agrupado, seria necessário que o índice não agrupado listasse qualquer uma das colunas contidas no índice agrupado?

Em outras palavras, se a tabela Produtos contiver um índice clusterizado no ProductID, ao criar um índice não clusterizado, no qual seria aconselhável incluir a coluna ProductID, será necessário adicioná-lo como uma coluna?

Caso contrário, há cenários em que seria bom adicionar o nome da coluna ao índice não agrupado?

Nico
fonte

Respostas:

19

No SQL Server, as colunas da chave de índice em cluster são sempre adicionadas ao índice não em cluster para atuar como localizador de linhas (Ref: Mais informações sobre chaves de índice não clusterizadas ).

Para um NCI declarado como exclusivo, eles são adicionados como uma coluna incluída, caso contrário, são adicionados ao final da chave.

Convém adicionar as colunas explicitamente se o posicionamento padrão não for ideal para suas consultas. Por exemplo, se você deseja controlar a direção ASC/ DESCou deseja controlar a posição das colunas-chave no índice.

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) 
Martin Smith
fonte