Was ist der Unterschied zwischen einer clustered
und einem non-clustered index
?
Clustered Index
Nicht gruppierter Index
Beide Indextypen verbessern die Leistung, wenn Sie Daten mit Feldern auswählen, die den Index verwenden, jedoch die Aktualisierungs- und Einfügeoperationen verlangsamen.
Aufgrund der langsameren Einfügung und Aktualisierung sollten Clustered-Indizes für ein Feld festgelegt werden, das normalerweise inkrementell ist, dh Id oder Timestamp.
SQL Server verwendet normalerweise nur einen Index, wenn seine Selektivität über 95% liegt.
Clustered-Indizes ordnen die Daten physisch auf der Festplatte. Dies bedeutet, dass keine zusätzlichen Daten für den Index benötigt werden, es kann jedoch nur einen Clustered-Index (offensichtlich) geben. Der Zugriff auf Daten über einen Clustered-Index ist am schnellsten.
Alle anderen Indizes dürfen nicht gruppiert sein. Bei einem nicht gruppierten Index werden die Daten aus den indizierten Spalten zusammen mit Zeigern auf die eigentlichen Datenzeilen (die Zeiger auf den gruppierten Index, falls vorhanden) geordnet angeordnet. Dies bedeutet, dass der Zugriff auf Daten über einen nicht gruppierten Index eine zusätzliche Umleitungsebene 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ückholen.
Clustered-Indizes werden physisch in der Tabelle gespeichert. Dies bedeutet, dass sie am schnellsten sind und Sie nur einen gruppierten Index pro Tabelle haben können.
Nicht gruppierte Indizes werden separat gespeichert, und Sie können beliebig viele haben.
Die beste Option ist, Ihren Clustered-Index für die am häufigsten verwendete eindeutige Spalte festzulegen, normalerweise für die PK. Sie sollten immer einen gut ausgewählten Clustered-Index in Ihren Tabellen haben, es sei denn, es liegt ein sehr zwingender Grund vor - ich kann mir keinen einzigen vorstellen, aber hey, es kann da draußen sein - da dies nicht der Fall ist.
Abgesehen von diesen Unterschieden müssen Sie wissen, dass Datendateien ungeordnet sind, wenn die Tabelle nicht gruppiert ist (wenn die Tabelle keinen gruppierten Index hat), und dass die Datenstruktur Heap-Datenstruktur verwendet.
Clustered bedeutet im Wesentlichen, dass sich die Daten in der Tabelle in dieser physischen Reihenfolge befinden. Aus diesem Grund können Sie nur einen Tisch pro Tabelle haben.
Unclustered bedeutet, dass es "nur" eine logische Reihenfolge ist.
Pros:
Clustered-Indizes eignen sich hervorragend für Bereiche (beispielsweise select * aus my_table, wobei my_key zwischen @min und @max steht).
In einigen Fällen muss das DBMS nicht arbeiten, um zu sortieren, wenn Sie eine orderby-Anweisung verwenden.
Nachteile:
Clusterindizes können Einfügungen verlangsamen, da die physischen Layouts der Datensätze geändert werden müssen, da Datensätze eingefügt werden, wenn die neuen Schlüssel nicht in sequenzieller Reihenfolge sind.
Ein Clustered-Index beschreibt tatsächlich die Reihenfolge, in der die Datensätze physisch auf der Festplatte gespeichert werden. Daher kann es nur einen Grund dafür geben.
Ein nicht gruppierter Index definiert eine logische Reihenfolge, die nicht der physischen Reihenfolge auf der Festplatte entspricht.
Ein Clustered-Index ist im Wesentlichen eine sortierte Kopie der Daten in den indizierten Spalten.
Der Hauptvorteil eines Clustered-Index besteht darin, dass, wenn Ihre Abfrage (Suchen) die Daten im Index findet, keine zusätzlichen IO 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 empfehlenswert, einen nicht-Clustered-Index zu erstellen.
Eine indizierte Datenbank besteht aus zwei Teilen: einem Satz physischer Datensätze, die in beliebiger Reihenfolge angeordnet sind, und einem Indexsatz, der die Reihenfolge angibt, in der Datensätze gelesen werden sollten, um ein Ergebnis zu erhalten, das nach einem bestimmten Kriterium sortiert ist. Wenn zwischen der physischen Anordnung und dem Index keine Korrelation besteht, müssen beim Lesen aller Datensätze in der Reihenfolge möglicherweise viele unabhängige Einzelsatzlesevorgänge ausgeführt werden. Da eine Datenbank in der Lage ist, Dutzende aufeinanderfolgender Datensätze in kürzerer Zeit als das Lesen von zwei nicht aufeinander folgenden Datensätzen zu lesen, kann die Leistung verbessert werden, wenn Datensätze, die im Index fortlaufend sind, auch aufeinanderfolgend auf der Festplatte gespeichert werden. Wenn Sie angeben, dass ein Index in einem Cluster zusammengefasst ist, muss die Datenbank einige Anstrengungen unternehmen (verschiedene Datenbanken unterscheiden sich je nach Umfang), um die Daten so anzuordnen, dass Gruppen von Datensätzen, die im Index aufeinander folgen, aufeinanderfolgend auf der Festplatte liegen.
Wenn Sie beispielsweise mit einer leeren, nicht gruppierten Datenbank beginnen und 10.000 Datensätze in zufälliger Reihenfolge hinzufügen, werden die Datensätze wahrscheinlich am Ende in der Reihenfolge hinzugefügt, in der sie hinzugefügt wurden. Das Auslesen der Datenbank nach dem Index würde 10.000 Lesevorgänge für einen Datensatz erfordern. Wenn jedoch eine Clusterdatenbank verwendet wird, überprüft das System beim Hinzufügen jedes Datensatzes möglicherweise, ob der vorherige Datensatz von ihm selbst gespeichert wurde. Wenn dies der Fall ist, kann es diesen Datensatz mit dem neuen am Ende der Datenbank schreiben. Es könnte dann den physischen Datensatz vor den Slots betrachten, in denen sich die verschobenen Datensätze befanden, und nachsehen, ob der darauf folgende Datensatz von ihm gespeichert wurde. Wenn dies der Fall sein sollte, könnte es diesen Datensatz an diese Stelle verschieben. Die Verwendung dieser Art von Ansatz würde dazu führen, dass viele Datensätze in Paaren zusammengefasst werden, wodurch die sequentielle Lesegeschwindigkeit möglicherweise nahezu verdoppelt wird.
In der Realität verwenden Clusterdatenbanken komplexere Algorithmen als diese. Zu beachten ist jedoch, dass es einen Kompromiss gibt zwischen der Zeit, die zum Aktualisieren der Datenbank benötigt wird, und der Zeit, die zum sequentiellen Lesen der Datenbank benötigt wird. Durch das Verwalten einer Clusterdatenbank wird der Arbeitsaufwand zum Hinzufügen, Entfernen oder Aktualisieren von Datensätzen auf eine Weise erheblich erhöht, die die Sortierreihenfolge beeinflusst. Wenn die Datenbank viel öfter sequenziell gelesen wird als aktualisiert wird, kann Clustering ein großer Gewinn sein. Wenn es häufig aktualisiert wird, aber selten nacheinander ausgelesen wird, kann das Clustering einen großen Leistungsabfall bedeuten, insbesondere wenn die Reihenfolge, in der Elemente zur Datenbank hinzugefügt werden, unabhängig von ihrer Sortierreihenfolge in Bezug auf den gruppierten Index ist.
Möglicherweise haben Sie den theoretischen Teil der obigen Beiträge durchlaufen:
-Der Clustered-Index, da wir Punkte direkt zum Aufzeichnen sehen können, d. H. Seine direkten Werte, sodass die Suche weniger Zeit in Anspruch nimmt. Außerdem wird kein zusätzlicher Speicherplatz benötigt, um den Index zu speichern.
-Wenn der Index im nicht gruppierten Index indirekt auf den gruppierten Index verweist, wird er auf den eigentlichen Datensatz zugreifen. Aufgrund seines indirekten Charakters dauert es etwas mehr Zeit, um darauf zuzugreifen. Außerdem benötigt er einen eigenen Speicher speichere den Index
// Aus MSDN kopiert, wird der zweite Punkt des nicht gruppierten Index in den anderen Antworten nicht eindeutig erwähnt.
gruppiert
Nonclustered