Czy konieczne jest uwzględnienie kolumn indeksów klastrowych w indeksach nieklastrowanych?

15

Biorąc pod uwagę, że indeks nieklastrowany jest oparty na indeksie klastrowym, czy konieczne byłoby, aby indeks nieklastrowany wymieniał którąkolwiek z kolumn zawartych w indeksie klastrowanym?

Innymi słowy, jeśli tabela Products zawiera indeks klastrowany na ProductID, podczas tworzenia indeksu nieklastrowanego, w którym wskazane byłoby dołączenie kolumny ProductID, czy konieczne jest dodanie go jako kolumny?

Jeśli nie, to czy istnieją scenariusze, w których dobrze byłoby dodać nazwę kolumny do indeksu nieklastrowanego?

Nico
źródło

Odpowiedzi:

20

W SQL Server kolumny indeksów klastrowych są zawsze dodawane do indeksu nieklastrowanego, aby działały jako lokalizator wierszy (zob .: Więcej informacji na temat nieklastrowanych kluczy indeksu ).

W przypadku NCI zadeklarowanych jako unikalne są one dodawane jako dołączona kolumna, w przeciwnym razie są dodawane na końcu klucza.

Możesz wyraźnie dodać kolumny, jeśli domyślne ustawienie nie jest optymalne dla twoich zapytań. Na przykład, jeśli chcesz kontrolować kierunek ASC/ DESClub chcesz kontrolować pozycję kluczowych kolumn w indeksie.

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
źródło