¿Es necesario incluir columnas de índice agrupadas en índices no agrupados?


15

Teniendo en cuenta que un índice no agrupado se basa en el índice agrupado, ¿sería necesario que el índice no agrupado enumere cualquiera de las columnas contenidas en el índice agrupado?

En otras palabras, si la tabla Productos contiene un índice agrupado en ProductID, al crear un índice no agrupado donde sería aconsejable incluir la columna ProductID, ¿es necesario agregarlo como una columna?

Si no, ¿hay escenarios en los que sería bueno agregar el nombre de la columna al índice no agrupado?

Respuestas:


20

En SQL Server, las columnas de clave de índice agrupadas siempre se agregan al índice no agrupado para actuar como un localizador de filas (Ref: Más sobre claves de índice no agrupadas ).

Para un NCI declarado como único, se agregan como una columna incluida; de lo contrario, se agregan al final de la clave.

Es posible que desee agregar las columnas explícitamente si la ubicación predeterminada no es óptima para sus consultas. Por ejemplo, si desea controlar la dirección ASC/ DESCo desea controlar la posición de las columnas clave en el í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) 
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.