Was ist der Vorteil der Verwendung einer INCLUDE-Spalte mit einem SQL Server-Index?

7
%Vor%

In der obigen Syntax werden wir Nicht-Schlüsselspalten im INCLUDE angeben. Was ist der Vorteil bei der Angabe von Nicht-Schlüsselspalten?

    
Anoop 03.05.2009, 22:44
quelle

5 Antworten

29

Nehmen wir an, Sie haben eine Mitarbeiter-Tabelle wie folgt:

%Vor%

Sie hätten den primären Clusterschlüssel auf EmployeeID und möglicherweise einen nicht gruppierten Schlüssel auf (LastName, FirstName), um Mitarbeiter nach Namen zu finden.

%Vor%

Wenn Sie jetzt "Joe Murphy" suchen und sein Einstellungsdatum und Gehalt abrufen müssen, wird ein Index-Suchvorgang in Ihrem Namen-basierten nicht-gruppierten Schlüssel (der gut ist) ausgeführt, aber dann, um die Einstellung abzurufen Datum und Gehalt, SQL Server muss ein so genanntes Bookmark-Lookup in die tatsächlichen Tabellendaten durchführen, um den Rekord für Joe Murphy zu erhalten. Dies wird höchstwahrscheinlich einen oder mehrere physische Festplattenzugriffe verursachen (was in Bezug auf die Leistung schlecht ist).

JEDOCH: wenn Ihr name-based non-clustered index auch "INCLUDE (HireDate, Gehalt)" angibt:

%Vor%

dann SQL Server ist getan, wenn es Joe Murphy im nicht gruppierten Namensindex nachgeschlagen wird - & gt; Alle Felder, die Ihre Abfrage erfüllen sollen, befinden sich im nicht gruppierten Index. Es ist also nicht mehr erforderlich, eine datenträgeintensive Lesezeichensuche durchzuführen, und Ihre Abfragen sind möglicherweise wesentlich schneller.

Der Nachteil von INCLUDE-Spalten ist der erhöhte Speicherplatzbedarf für nicht gruppierte Indizes, da sie die enthaltenen Spalten in ihren Knoten auf Blattebene enthalten. Es ist ein Kompromiss zwischen Geschwindigkeit und Größe (wie üblich).

Marc

    
marc_s 04.05.2009 05:13
quelle
6

Wenn ein Index verwendet wird, kann er entweder zum Speicherort des vollständigen Datensatzes führen oder alle benötigten Felder können im Index selbst gespeichert werden (Sie müssen also nicht zum vollständigen Datensatz gehen).

Im ersten Fall haben Sie zwei Lesevorgänge im besten Fall, einen zum Lesen des Index und einen zum Lesen des vollständigen Datensatzes.

Im zweiten Fall erhalten Sie alles, was Sie brauchen, um den Index zu lesen.

Sie können zusätzliche Spalten einschließen, die zusammen mit dem Index gespeichert werden sollen, wenn Sie mit den Feldern, aus denen der Index besteht, vollständige Abfragen durchführen können, ohne dass die zusätzliche Zeile gelesen werden muss.

Dies ist kein Problem für den CLUSTERED-Index, da das Lesen des Indexes dem Lesen der gesamten Zeile entspricht.

Besonders vorteilhaft ist es, wenn Sie in einer Sequenz mehrere Indexschlüssel lesen (zB SELECT ... FROM ... WHERE Schlüssel BETWEEN n1 AND n2), weil die Index-Lesevorgänge wahrscheinlich nebeneinander gespeichert werden und können mit vielleicht nur einem oder zwei physikalischen Sektoren gelesen werden; und den Rest der Datensätze nicht finden zu müssen, bietet mehr Hebelwirkung.

    
dkretz 03.05.2009 22:55
quelle
1

Dies speichert die Daten für die Spalte mit dem Indexknoten für den schnellen Zugriff auf Abfragen, die den Index verwenden.

Referenz :

  

INCLUDE (Spalte [, ... n])

     

Gibt die Nicht-Schlüsselspalten an   zur Blattebene der hinzugefügt   Nonclustered-Index. Das Nonclustered   Index kann eindeutig oder nicht eindeutig sein.

    
tvanfosson 03.05.2009 22:49
quelle
0

Die Suche nach Schlüsseln entfällt, wenn die Abfrage die enthaltene Spalte verwendet. Beispiel.

%Vor%

Ein entsprechender Index würde so aussehen

%Vor%     
Al W 03.05.2009 22:56
quelle
0

Der Vorteil des Include-Index besteht darin, Größenbeschränkungen zu vermeiden.

%Vor%

Obwohl Sie alle Spalten als Schlüsselspalten definieren könnten, wäre die Schlüsselgröße 334 Byte. Nur die hier verwendeten Kriterien sind Postleitzahl, Postleitzahlen in der Schlüsselspalte und Rest in Nicht-Schlüsselspalten verbessern die Leistung und auch das Speichern der Größe.

%Vor%     
sampath acharya 17.11.2017 16:22
quelle

Tags und Links