webentwicklung-frage-antwort-db.com.de

Was sind die Unterschiede zwischen einem gruppierten und einem nicht gruppierten Index?

Was ist der Unterschied zwischen einer clustered und einem non-clustered index?

254
Eric Labashosky

Clustered Index

  • Nur eine pro Tabelle
  • Schneller zu lesen als nicht gruppiert, da Daten physisch in der Indexreihenfolge gespeichert werden

Nicht gruppierter Index

  • Kann mehrmals pro Tisch verwendet werden
  • Schneller für Einfüge- und Aktualisierungsvorgänge als ein Clustered-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.

241
Martynnw

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.

69
rslite

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.

31
Santiago Cepas

Clustered Index

  1. Es kann nur einen Clusterindex 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 SQL-Version 2005 unterstützen bis zu 999 nicht gruppierte Indizes).
  2. Normalerweise auf der beliebigen Taste gemacht.
  3. Der Blattknoten eines nicht gruppierten Index besteht nicht aus den Datenseiten. Stattdessen enthalten die Blattknoten Indexzeilen.
25
Jojo

Clustered Index

  • In einer Tabelle kann nur ein Clustered-Index vorhanden sein
  • Sortieren Sie die Datensätze und speichern Sie sie entsprechend der Reihenfolge
  • Der Datenabruf ist schneller als nicht gruppierte Indizes
  • Sie benötigen keinen zusätzlichen Speicherplatz zum Speichern der logischen Struktur

Nicht gruppierter Index

  • In einer Tabelle können beliebig viele nicht gruppierte Indizes vorhanden sein
  • 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 gruppiert ist (wenn die Tabelle keinen gruppierten Index hat), und dass die Datenstruktur Heap-Datenstruktur verwendet.

20
Lasitha Yapa

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.

8
Biri

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.

6
Giovanni Galbo

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.

5
Josh

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.

5
Ed Guiness

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.

5
supercat

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

 enter image description here

0

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

gruppiert

  • 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 in sortierter Reihenfolge gespeichert, wenn die Tabelle einen Clustered-Index enthält. Wenn eine Tabelle einen Clustered-Index hat, wird die Tabelle als Clustertabelle bezeichnet. Wenn eine Tabelle Keinen gruppierten Index hat, werden ihre Datenzeilen in einer ungeordneten Struktur gespeichert, die als Heap bezeichnet wird.

Nonclustered

  • Nicht gruppierte Indizes haben eine Struktur, die von den Datenzeilen getrennt ist. Ein Nonclustered-Index enthält die Nonclustered-Indexschlüsselwerte und
    Jeder Schlüsselwerteintrag weist einen Zeiger auf die Datenzeile auf, 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 gruppierten Tabelle gespeichert sind. Ein Zeilenlokator ist ein Zeiger auf die Zeile. Bei einer gruppierten -Tabelle ist der Zeilen-Locator der gruppierte Indexschlüssel.
0
Deepak Mishra