Müssen gruppierte Indexspalten in nicht gruppierte Indizes aufgenommen werden?

15

Wenn man bedenkt, dass ein nicht gruppierter Index auf dem gruppierten Index basiert, muss der nicht gruppierte Index dann eine der Spalten auflisten, die im gruppierten Index enthalten sind?

Mit anderen Worten, wenn die Products-Tabelle einen Clustered-Index für die ProductID enthält, ist es beim Erstellen eines Non-Clustered-Index erforderlich, die ProductID-Spalte trotzdem als Spalte hinzuzufügen.

Wenn nicht, gibt es Szenarien, in denen es sinnvoll ist, den Spaltennamen zum nicht gruppierten Index hinzuzufügen?

Nico
quelle

Antworten:

19

In SQL Server werden die Spalten mit dem gruppierten Indexschlüssel immer zum nicht gruppierten Index hinzugefügt, um als Zeilenlokator zu fungieren ( siehe : Weitere Informationen zu nicht gruppierten Indexschlüsseln ).

Für eine als eindeutig deklarierte NCI werden sie als eingeschlossene Spalte hinzugefügt, andernfalls werden sie am Ende des Schlüssels hinzugefügt.

Möglicherweise möchten Sie die Spalten explizit hinzufügen, wenn die Standardplatzierung für Ihre Abfragen nicht optimal ist. Zum Beispiel, wenn Sie die Richtung ASC/ DESCoder die Position der Schlüsselspalten im Index steuern möchten.

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
quelle