Was sind die Unterschiede zwischen einem Clustered-Index und einem Nicht-Clustered-Index?

277

Was sind die Unterschiede zwischen a clusteredund a non-clustered index?

Eric Labashosky
quelle
8
Sie können nur einen Clustered-Index pro Tabelle haben. Aber es gibt noch viele andere Unterschiede ...
Tom Robinson
5
Ein Clustered-Index beschreibt tatsächlich die Reihenfolge, in der Datensätze physisch auf der Festplatte gespeichert werden, weshalb Sie nur einen haben können. Ein nicht gruppierter Index definiert eine logische Reihenfolge, die nicht mit der physischen Reihenfolge auf der Festplatte übereinstimmt.
Josh
1
Clustered bedeutet im Grunde, dass die Daten in der Tabelle in dieser physischen Reihenfolge vorliegen. Aus diesem Grund können Sie nur eine pro Tabelle haben. Nicht gruppiert bedeutet, dass es "nur" eine logische Reihenfolge ist.
Biri
2
@ Biri Was ist "logische" Reihenfolge? Ein nicht gruppierter Index speichert die Indexschlüssel in der richtigen Reihenfolge und einen Zeiger auf die Tabelle, nämlich den gruppierten Indexschlüssel.
Stephanie Seite
@Stephanie Page: Aus tabellarischer Sicht logisch. Natürlich sind nicht gruppierte Indizes physisch im Index selbst angeordnet.
Biri

Antworten:

268

Clustered Index

  • Nur eine pro Tisch
  • Schneller zu lesen als nicht geclustert, da Daten physisch in Indexreihenfolge gespeichert werden

Nicht gruppierter Index

  • Kann mehrmals pro Tabelle verwendet werden
  • Schneller für Einfüge- und Aktualisierungsvorgänge als ein Clustered-Index

Beide Indextypen verbessern die Leistung, wenn Daten mit Feldern ausgewählt werden, die den Index verwenden, aber Aktualisierungs- und Einfügevorgänge verlangsamen.

Aufgrund des langsameren Einfügens und Aktualisierens sollten Clustered-Indizes für ein Feld festgelegt werden, das normalerweise inkrementell ist, z. B. ID oder Zeitstempel.

SQL Server verwendet normalerweise nur einen Index, wenn seine Selektivität über 95% liegt.

Martynnw
quelle
9
Es gibt auch Speicherüberlegungen. Wenn Sie Zeilen in eine Tabelle ohne Clustered-Index einfügen, werden die Zeilen hintereinander auf der Seite gespeichert. Das Aktualisieren einer Zeile kann dazu führen, dass die Zeile an das Ende der Tabelle verschoben wird, Leerzeichen verbleibt und die Tabelle und die Indizes fragmentiert werden.
Jeremiah Peschka
4
Sie müssen sich nicht darum kümmern, was x ist. Alles, was Sie wissen müssen, ist, dass für eine App mit Millionen von Benutzern x von Bedeutung sein wird
Pacerier
14
Es ist ein reines Dogma. Es ist nicht "schneller zu lesen, weil die Daten in der richtigen Reihenfolge gespeichert sind". Das Lesen ist schneller, da Sie das Lesen eines Index und das Lesen der Tabelle vermeiden. Der Entfernungsscan ist schneller (wenn dies sinnvoll ist), da die Daten in der richtigen Reihenfolge gespeichert werden. dh der Clustering-Faktor ist perfekt.
Stephanie Seite
6
Auch die Idee, dass 95% der Datensätze eindeutig sein müssen, ist ein Irrtum. Angenommen, Sie haben eine Tabelle mit 1.000.000 Zeilen und indizieren eine Spalte mit 500.000 Schlüsseln. 0% sind eindeutig, aber jeder Schlüssel gibt 2 von einer Million Zeilen zurück. Dieser Index ist absolut nützlich, unabhängig davon, dass 0% der Datensätze eindeutig sind.
Stephanie Seite
2
"Daten werden physisch in Indexreihenfolge gespeichert" Was meinen Sie damit? Auf einer Ebene ist es trivial wahr, weil die Datenseiten und die Indexblattseiten ein und dasselbe sind - also beschreibt die Reihenfolge der einen offensichtlich die Reihenfolge der anderen. Dies ist jedoch nicht unbedingt in einer bestimmten Reihenfolge wie der Reihenfolge des Indexschlüssels stackoverflow.com/questions/1251636/…
Martin Smith
79

Clustered-Indizes ordnen die Daten auf der Festplatte physisch an. Dies bedeutet, dass für den Index keine zusätzlichen Daten benötigt werden, es jedoch (offensichtlich) nur einen Clustered-Index geben kann. Der Zugriff auf Daten mithilfe eines Clustered-Index ist am schnellsten.

Alle anderen Indizes dürfen nicht geclustert sein. Ein nicht gruppierter Index enthält ein Duplikat der Daten aus den indizierten Spalten, die zusammen mit Zeigern auf die tatsächlichen Datenzeilen (Zeiger auf den gruppierten Index, falls vorhanden) geordnet sind. Dies bedeutet, dass der Zugriff auf Daten über einen nicht gruppierten Index eine zusätzliche Indirektionsebene durchlaufen muss. Wenn Sie jedoch nur die Daten auswählen, die in den indizierten Spalten verfügbar sind, können Sie die Daten direkt aus den duplizierten Indexdaten zurückerhalten (daher ist es eine gute Idee, nur die Spalten auszuwählen, die Sie benötigen und nicht verwenden *).

rslite
quelle
3
"Wenn Sie jedoch nur die Daten auswählen, die in den indizierten Spalten verfügbar sind, können Sie die Daten direkt aus den duplizierten Indexdaten zurückholen." - Ja, dies ist die wichtige Ausnahme von der bevorzugten Cluster-Index-Heuristik. Ich denke, in diesem Fall haben Sie im Wesentlichen einen Clustered-Index, aber weniger Daten in der Tabelle, die Sie abfragen, sodass sie möglicherweise schneller von der Festplatte gelesen werden können.
Satnhak
34

Clustered-Indizes werden physisch in der Tabelle gespeichert. Dies bedeutet, dass sie am schnellsten sind und Sie nur einen Clustered-Index pro Tabelle haben können.

Nicht gruppierte Indizes werden separat gespeichert, und Sie können so viele Indizes haben, wie Sie möchten.

Die beste Option besteht darin, Ihren Clustered-Index für die am häufigsten verwendete eindeutige Spalte festzulegen, normalerweise die PK. Sie sollten immer einen gut ausgewählten Clustered-Index in Ihren Tabellen haben, es sei denn, es gibt einen sehr zwingenden Grund - ich kann mir keinen einzigen vorstellen, aber hey, es kann da draußen sein -, dass dies nicht der Fall ist.

Santiago Cepas
quelle
3
Können Sie näher auf "Wir sollten immer einen Clustered-Index in unseren Tabellen haben" näher eingehen? ohne
näher darauf einzugehen
1
Sie haben Recht, Pacerier, man sollte absolute Aussagen nicht leichtfertig verwenden. Obwohl ich keinen einzigen Fall kenne, in dem Sie keinen gut ausgewählten Clustered-Index haben sollten, könnte ein solcher Fall existieren, sodass ich meine Antwort auf eine allgemeinere Version geändert habe.
Santiago Cepas
28

Clustered Index

  1. Es kann nur einen Clustered-Index für eine Tabelle geben.
  2. Wird normalerweise auf dem Primärschlüssel erstellt.
  3. Die Blattknoten eines Clustered-Index enthalten die Datenseiten.

Nicht gruppierter Index

  1. Es können nur 249 nicht gruppierte Indizes für eine Tabelle vorhanden sein (bis zur späteren SQL-Version 2005 unterstützen spätere Versionen bis zu 999 nicht gruppierte Indizes).
  2. Normalerweise auf einem beliebigen Schlüssel gemacht.
  3. Der Blattknoten eines nicht gruppierten Index besteht nicht aus den Datenseiten. Stattdessen enthalten die Blattknoten Indexzeilen.
Jojo
quelle
24

Clustered Index

  • In einer Tabelle kann nur ein Clustered-Index vorhanden sein
  • Sortieren Sie die Datensätze und speichern Sie sie physisch gemäß der Reihenfolge
  • Das Abrufen von Daten ist schneller als bei nicht gruppierten Indizes
  • Benötigen Sie keinen zusätzlichen Speicherplatz zum Speichern der logischen Struktur

Nicht gruppierter Index

  • Eine Tabelle kann eine beliebige Anzahl von nicht gruppierten Indizes enthalten
  • Beeinflussen Sie nicht die physische Ordnung. Erstellen Sie eine logische Reihenfolge für Datenzeilen und verwenden Sie Zeiger auf physische Datendateien
  • Das Einfügen / Aktualisieren von Daten ist schneller als der Clustered-Index
  • Verwenden Sie zusätzlichen Speicherplatz zum Speichern der logischen Struktur

Abgesehen von diesen Unterschieden müssen Sie wissen, dass Datendateien ungeordnet sind, wenn die Tabelle nicht geclustert ist (wenn die Tabelle keinen gruppierten Index hat) und die Heap-Datenstruktur als Datenstruktur verwenden.

Lasitha Yapa
quelle
10

Clustered bedeutet im Grunde, dass sich die Daten in der Tabelle in dieser physischen Reihenfolge befinden. Aus diesem Grund können Sie nur eine pro Tabelle haben.

Nicht gruppiert bedeutet, dass es "nur" eine logische Reihenfolge ist.

Biri
quelle
9

Vorteile:

Clustered-Indizes eignen sich hervorragend für Bereiche (z. B. * aus my_table auswählen, wobei my_key zwischen @min und @max liegt).

Unter bestimmten Umständen muss das DBMS keine Arbeit zum Sortieren ausführen, wenn Sie eine orderby-Anweisung verwenden.

Nachteile:

Clustered-Indizes können Einfügungen verlangsamen, da die physischen Layouts der Datensätze beim Einfügen von Datensätzen geändert werden müssen, wenn die neuen Schlüssel nicht in sequenzieller Reihenfolge vorliegen.

Giovanni Galbo
quelle
6

Ein Clustered-Index ist im Wesentlichen eine sortierte Kopie der Daten in den indizierten Spalten.

Der Hauptvorteil eines Clustered-Index besteht darin, dass beim Abrufen der Daten im Index durch Ihre Abfrage (Suche) keine zusätzlichen E / A erforderlich sind, um diese Daten abzurufen.

Der Aufwand für die Verwaltung eines Clustered-Index, insbesondere in einer häufig aktualisierten Tabelle, kann zu einer schlechten Leistung führen. Aus diesem Grund ist es möglicherweise vorzuziehen, einen Nicht-Clustered-Index zu erstellen.

Ed Guiness
quelle
6

Eine indizierte Datenbank besteht aus zwei Teilen: einer Reihe von physischen Datensätzen, die in einer beliebigen Reihenfolge angeordnet sind, und einer Reihe von Indizes, die die Reihenfolge angeben, in der Datensätze gelesen werden sollen, um ein nach einem Kriterium sortiertes Ergebnis zu erhalten. Wenn keine Korrelation zwischen der physischen Anordnung und dem Index besteht, müssen zum Auslesen aller Datensätze in der angegebenen Reihenfolge möglicherweise viele unabhängige Lesevorgänge für einzelne Datensätze ausgeführt werden. Da eine Datenbank möglicherweise Dutzende aufeinanderfolgender Datensätze in kürzerer Zeit lesen kann als zwei nicht aufeinanderfolgende Datensätze, kann die Leistung verbessert werden, wenn Datensätze, die im Index aufeinanderfolgend sind, auch nacheinander auf der Festplatte gespeichert werden.

Wenn man beispielsweise mit einer leeren Datenbank ohne Cluster beginnen und 10.000 Datensätze in zufälliger Reihenfolge hinzufügen möchte, werden die Datensätze wahrscheinlich am Ende in der Reihenfolge hinzugefügt, in der sie hinzugefügt wurden. Das Auslesen der Datenbank in der Reihenfolge nach Index würde 10.000 Lesevorgänge mit einem Datensatz erfordern. Wenn jedoch eine Clusterdatenbank verwendet wird, prüft das System möglicherweise beim Hinzufügen jedes Datensatzes, ob der vorherige Datensatz für sich selbst gespeichert wurde. Wenn dies der Fall ist, wird dieser Datensatz möglicherweise mit dem neuen am Ende der Datenbank geschrieben. Es könnte dann den physischen Datensatz vor den Slots überprüfen, in denen sich die verschobenen Datensätze befanden, um festzustellen, ob der darauf folgende Datensatz von selbst gespeichert wurde. Wenn dies der Fall wäre, könnte es diesen Datensatz an diese Stelle verschieben. Die Verwendung dieses Ansatzes würde dazu führen, dass viele Datensätze paarweise zusammengefasst werden.

In der Realität verwenden Clustered-Datenbanken komplexere Algorithmen als diese. Ein wichtiger Punkt ist jedoch, dass es einen Kompromiss zwischen der zum Aktualisieren der Datenbank erforderlichen Zeit und der zum sequentiellen Lesen erforderlichen Zeit gibt. Durch die Verwaltung einer Clusterdatenbank wird der Arbeitsaufwand für das Hinzufügen, Entfernen oder Aktualisieren von Datensätzen in einer Weise erheblich erhöht, die sich auf die Sortierreihenfolge auswirkt. Wenn die Datenbank viel häufiger nacheinander gelesen als aktualisiert wird, kann das Clustering ein großer Gewinn sein. Wenn es häufig aktualisiert wird, aber selten nacheinander ausgelesen wird, kann das Clustering einen großen Leistungsverlust bedeuten, insbesondere wenn die Reihenfolge, in der Elemente zur Datenbank hinzugefügt werden, unabhängig von ihrer Sortierreihenfolge in Bezug auf den Clustered-Index ist.

Superkatze
quelle
5

Ein Clustered-Index beschreibt tatsächlich die Reihenfolge, in der Datensätze physisch auf der Festplatte gespeichert werden, weshalb Sie nur einen haben können.

Ein nicht gruppierter Index definiert eine logische Reihenfolge, die nicht mit der physischen Reihenfolge auf der Festplatte übereinstimmt.

Josh
quelle
2

Möglicherweise haben Sie den theoretischen Teil der obigen Beiträge durchlaufen:

-Der gruppierte Index, da wir Punkte sehen können, die direkt aufgezeichnet werden sollen, dh direkt, sodass die Suche weniger Zeit in Anspruch nimmt. Außerdem wird kein zusätzlicher Speicherplatz benötigt, um den Index zu speichern

- Während im nicht gruppierten Index indirekt auf den gruppierten Index verwiesen wird, greift er auf den eigentlichen Datensatz zu. Aufgrund seiner indirekten Natur dauert der Zugriff etwas länger. Außerdem benötigt er einen eigenen Speicher / Speicherplatz zum Speichern des Index

Geben Sie hier die Bildbeschreibung ein

Nandkishor Nangre
quelle
0

// Aus MSDN kopiert, wird der zweite Punkt des nicht gruppierten Index in den anderen Antworten nicht klar erwähnt.

Clustered

  • Clustered-Indizes sortieren und speichern die Datenzeilen in der Tabelle oder Ansicht basierend auf ihren Schlüsselwerten. Dies sind die Spalten, die in der Indexdefinition enthalten sind. Es kann nur einen Clustered-Index pro Tabelle geben, da die Datenzeilen selbst nur in einer Reihenfolge gespeichert werden können.
  • Die Datenzeilen in einer Tabelle werden nur dann in sortierter Reihenfolge gespeichert, wenn die Tabelle einen Clustered-Index enthält. Wenn eine Tabelle einen Clustered-Index hat, wird die Tabelle als Clustered-Tabelle bezeichnet. Wenn eine Tabelle keinen Clustered-Index hat, werden ihre Datenzeilen in einer ungeordneten Struktur gespeichert, die als Heap bezeichnet wird.

Nicht gruppiert

  • Nicht gruppierte Indizes haben eine von den Datenzeilen getrennte Struktur. Ein nicht gruppierter Index enthält die nicht gruppierten Indexschlüsselwerte und
    jeder Schlüsselwerteintrag hat einen Zeiger auf die Datenzeile, die den Schlüsselwert enthält.
  • Der Zeiger von einer Indexzeile in einem nicht gruppierten Index auf eine Datenzeile wird als Zeilenlokator bezeichnet. Die Struktur des Zeilenlokators hängt davon ab, ob die Datenseiten in einem Heap oder einer Clustertabelle gespeichert sind. Bei einem Heap ist ein Zeilenfinder ein Zeiger auf die Zeile. Bei einer Clustertabelle ist der Zeilenlokator der Clustered-Indexschlüssel.
Deepak Mishra
quelle