È necessario includere colonne di indice cluster in indici non cluster?


15

Considerando che un indice non cluster si basa sull'indice cluster, sarebbe necessario che l'indice non cluster elenchi una delle colonne contenute nell'indice cluster?

In altre parole se la tabella Products contiene un indice cluster su ProductID, quando si crea un indice non cluster in cui sarebbe consigliabile includere la colonna ProductID, è necessario tuttavia aggiungerlo come colonna?

In caso contrario, ci sono scenari in cui sarebbe opportuno aggiungere il nome della colonna all'indice non cluster?

Risposte:


19

In SQL Server le colonne chiave dell'indice cluster vengono sempre aggiunte all'indice non cluster per fungere da localizzatore di righe (Rif .: Altre informazioni sulle chiavi di indice non cluster ).

Per un NCI dichiarato come univoco vengono aggiunti come colonna inclusa, altrimenti vengono aggiunti alla fine della chiave.

Potresti voler aggiungere esplicitamente le colonne se il posizionamento predefinito non è ottimale per le tue query. Ad esempio, se si desidera controllare la direzione ASC/ DESCo si desidera controllare la posizione delle colonne chiave nell'indice.

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) 
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.