SQL Server - Wann wird Clustered vs. Non-Clustered Index verwendet?

99

Ich kenne die Hauptunterschiede zwischen geclusterten und nicht geclusterten Indizes und verstehe, wie sie tatsächlich funktionieren. Ich verstehe, wie geclusterte und nicht geclusterte Indizes die Leseleistung verbessern. Ich bin mir jedoch nicht sicher, aus welchen Gründen ich einen über den anderen wählen würde.

Beispiel: Wenn eine Tabelle keinen Clustered-Index hat, sollte man einen Nicht-Clustered-Index erstellen und was ist der Vorteil davon?

Armulator
quelle
3
Danke für die Antwort. Das ist mir schon bewusst. Meine Frage ist,
ob
2
Ja, Sie sollten einen Clustered-Index vermeiden, wenn; Die Spalte hat eine geringe Kardinalität, keine bestimmte Reihenfolge, häufig aktualisiert, nicht sequentiell, sie setzt sich aus vielen Spalten zusammen ...
TI
Danke für deine Antwort. Es ist hilfreich
Armulator
1
Vielleicht würde diese Frage Ihnen helfen: stackoverflow.com/questions/5070529/…
David García González
Mögliches Duplikat von In welcher Spalte soll der Clustered-Index platziert werden?
Michael Freidgeim

Antworten:

117

Ich möchte nur ein Wort der Warnung einbringen: Bitte wählen Sie Ihren Clustered-Index sehr sorgfältig aus ! Jede "reguläre" Datentabelle sollte einen Clustered-Index haben, da ein Clustered-Index tatsächlich viele Operationen beschleunigt - ja, beschleunigen , sogar einfügen und löschen! Aber nur, wenn Sie einen guten Clustered-Index auswählen .

Dies ist die am häufigsten replizierte Datenstruktur in Ihrer SQL Server-Datenbank. Der Clustering-Schlüssel ist auch Teil jedes nicht geclusterten Index in Ihrer Tabelle.

Bei der Auswahl eines Clustering-Schlüssels sollten Sie äußerst vorsichtig sein - es sollte sein:

  • schmal (4 Bytes ideal)

  • einzigartig (es ist schließlich der "Zeilenzeiger". Wenn Sie ihn nicht eindeutig machen, erledigt SQL Server dies im Hintergrund für Sie und kostet Sie ein paar Bytes für jeden Eintrag multipliziert mit der Anzahl der Zeilen und der Anzahl der nicht gruppierten Indizes Sie haben - das kann sehr teuer sein!)

  • statisch (niemals ändern - wenn möglich)

  • Idealerweise immer größer, damit Sie nicht zu einer schrecklichen Indexfragmentierung kommen (eine GUID ist das genaue Gegenteil eines guten Clustering-Schlüssels - aus diesem speziellen Grund).

  • es sollte nicht nullbar sein und idealerweise auch eine feste Breite haben - a varchar(250)macht einen sehr schlechten Clustering-Schlüssel

Alles andere sollte hinter diesen Punkten wirklich die zweite und dritte Bedeutungsebene haben ...

Sehen Sie sich einige Blog-Beiträge von Kimberly Tripp ( Die Königin der Indexierung ) zu diesem Thema an - alles, was sie in ihrem Blog geschrieben hat, ist von unschätzbarem Wert - lesen Sie es, verdauen Sie es - leben Sie danach!

marc_s
quelle
1
Danke marc_s für die klare Erklärung. Aber technisch gesehen, was macht der non clusteredIndex für uns? Was ist ihre Bedeutung ..?
Hud
@nad: Ein gut ausgewählter nicht gruppierter Index kann Ihre Suche beschleunigen. Anstatt potenziell Millionen von Datenzeilen mit Ihren Suchkriterien vergleichen zu müssen, können Sie eine bestimmte Zeile mit nur 4, 5 Vergleichen finden. Das macht einen RIESIGEN Unterschied!
marc_s
1
@ MuriloKunze: Lesen Sie Kim Tripps Blog-Beitrag zum Thema - sie erklärt ausführlich, warum dies der Fall ist
marc_s
5
Es tut mir leid, aber wo ist die Antwort auf die Frage "SQL Server - Wann wird Clustered vs. Non-Clustered Index verwendet?" ?
Eduard