Was sind die Unterschiede zwischen a clustered
und a non-clustered index
?
sql-server
indexing
clustered-index
non-clustered-index
Eric Labashosky
quelle
quelle
Antworten:
Clustered Index
Nicht gruppierter 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.
quelle
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 *).
quelle
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.
quelle
Clustered Index
Nicht gruppierter Index
quelle
Clustered Index
Nicht gruppierter Index
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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.
quelle
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
quelle
// Aus MSDN kopiert, wird der zweite Punkt des nicht gruppierten Index in den anderen Antworten nicht klar erwähnt.
Clustered
Nicht gruppiert
jeder Schlüsselwerteintrag hat einen Zeiger auf die Datenzeile, die den Schlüsselwert enthält.
quelle