Erstellen von Indizes mit eingeschlossenen Spalten

Ein nicht gruppierter Index kann erweitert werden, indem Nichtschlüsselspalten zusätzlich zu Indexschlüsselspalten eingeschlossen werden. Die Nichtschlüsselspalten werden auf der Blattebene der B-Struktur des Indexes gespeichert.

Indizes, die Nichtschlüsselspalten enthalten, bieten die größten Vorteile, wenn sie die Abfrage abdecken. Dies bedeutet, dass die Indizes alle Spalten enthalten, auf die die Abfrage verweist. Weitere Informationen finden Sie unter Index mit eingeschlossenen Spalten.

Anforderungen an den Speicherplatz

Durch das Hinzufügen von Nichtschlüsselspalten zum Index wird für das Speichern des Indexes mehr Speicherplatz verwendet. Insbesondere durch das Hinzufügen von varchar(max)-, nvarchar(max)-, varbinary(max)- oder xml-Datentypen als Nichtschlüsselspalten können die Anforderungen an den Speicherplatz erheblich steigen, weil die Spaltenwerte auf Blattebene in den Index kopiert werden und außerdem in der Tabelle oder dem gruppierten Index verbleiben.

Das Verfahren zum Ermitteln der Speicherplatzanforderungen für Indizes mit eingeschlossenen Spalten entspricht dem Verfahren für nicht gruppierte Indizes. Weitere Informationen finden Sie unter Ermitteln der Speicherplatzanforderungen für Indizes.

Überlegungen zur Leistung

Leistungsvorteile werden in ausgewählten Operationen erzielt, weil der Abfrageoptimierer alle erforderlichen Spaltendaten im Index finden kann; auf den Tabellen- oder gruppierten Index wird nicht zugegriffen. Wenn eine zu große Anzahl von eingeschlossenen Spalten vorhanden ist, kann dies jedoch zu einem größeren Zeitaufwand beim Ausführen von Einfügungs-, Aktualisierungs- oder Löschvorgängen an der zugrunde liegenden Tabelle oder indizierten Sicht führen, weil die Indexwartung aufwendiger ist.

Beispiele:

A. Abdecken einer Abfrage

Das folgende Beispiel erstellt einen nicht gruppierten Index für die Person.Address-Tabelle mit vier eingeschlossenen Spalten. Die Schlüsselspalte des Indexes ist PostalCode, die Nichtschlüsselspalten sind AddressLine1, AddressLine2, City, und StateProvinceID.

USE AdventureWorks;
GO
CREATE NONCLUSTERED INDEX IX_Address_PostalCode
ON Person.Address (PostalCode)
INCLUDE (AddressLine1, AddressLine2, City, StateProvinceID);
GO

Diese Abfrage wird vom Index abgedeckt.

SELECT AddressLine1, AddressLine2, City, StateProvinceID, PostalCode
FROM Person.Address
WHERE PostalCode BETWEEN '98000' and '99999';
GO

B. Überschreiten der Größenbeschränkung des Indexes

Im folgenden Beispiel wird die INCLUDE-Klausel der CREATE INDEX-Anweisung zum Indizieren von Spalten verwendet, die normalerweise die maximale Größenbeschränkung der Schlüsselspalte von 900 Byte überschreiten. Die Production.ProductReview-Tabelle enthält die folgenden Spalten: ProductID(int), ReviewerName(nvarchar (50)) und Comments (nvarchar (3850)). Diese Spalten werden häufig in Abfragen verwendet, die Comments-Spalte ist jedoch zu groß, um als Indexschlüsselspalte verwendet zu werden. Indem jedoch die INCLUDE-Klausel verwendet wird, kann die Comments-Spalte als Nichtschlüsselspalte im Index hinzugefügt werden.

USE AdventureWorks;
GO
CREATE NONCLUSTERED INDEX IX_ProductReview_ProductID_ReviewerName
ON Production.ProductReview (ProductID, ReviewerName)
INCLUDE (Comments);
GO

Diese Abfrage wird vom Index abgedeckt.

SELECT Comments
FROM Production.ProductReview 
WHERE ProductID = 937;
GO

So erstellen Sie einen Index mit eingeschlossenen Spalten