1297 Stimmen

Was bedeuten eigentlich Clustered und Non-Clustered Index?

Ich habe nur eine begrenzte Erfahrung mit DB und habe DB nur als Anwendungsprogrammierer benutzt. Ich möchte wissen über Clustered y Non clustered indexes . Ich habe gegoogelt, und was ich gefunden habe, war :

Ein geclusterter Index ist ein spezieller Index-Typ, der die Reihenfolge der Datensätze in der Tabelle physikalisch gespeichert werden. Daher kann eine Tabelle nur einen geclusterten Index haben. Die Blattknoten eines geclusterten Indexes enthalten die Daten Seiten. Ein nonclustered Index ist ein spezielle Art von Index, bei dem die logische Reihenfolge des Indexes nicht mit der physisch gespeicherten Reihenfolge der der Zeilen auf der Festplatte übereinstimmt. Der Blattknoten eines nonclustered index besteht nicht aus den Datenseiten. Stattdessen enthalten die Blatt Knoten Indexzeilen enthalten.

Was ich in SO fand, war Was sind die Unterschiede zwischen einem geclusterten und einem nicht geclusterten Index? .

Kann jemand das in einfachem Englisch erklären?

64voto

Geclusterter Index

Ein geclusterter Index bestimmt die physische Reihenfolge von DATA in einer Tabelle. Aus diesem Grund hat eine Tabelle nur einen geclusterten Index (Primärschlüssel/Verbundschlüssel).

" Wörterbuch " Es ist kein weiterer Index erforderlich, der Index besteht bereits aus den Wörtern

Nicht geclusterter Index

Ein nicht geclusterter Index entspricht einem Index in einem Buch: Die Daten werden an einem Ort gespeichert. Der Index wird an einem anderen Ort gespeichert und der Index hat Zeiger auf den Speicherort. Aus diesem Grund hat eine Tabelle mehr als 1 Nonclustered Index.

" Biologiebuch " gibt es einen separaten Index zum Punkt Kapitelstandort und beim " ENDE "Es gibt einen weiteren Index, der auf den gemeinsamen WORDS-Standort verweist

54voto

Dan Diplo Punkte 24765

Eine einfache, nicht-technische Faustregel besagt, dass geclusterte Indizes in der Regel für den Primärschlüssel (oder zumindest eine eindeutige Spalte) und nicht geclusterte Indizes für andere Situationen (z. B. einen Fremdschlüssel) verwendet werden. In der Tat erstellt SQL Server standardmäßig einen geclusterten Index für Ihre Primärschlüsselspalte(n). Wie Sie gelernt haben, bezieht sich der clustered index auf die Art und Weise, wie die Daten physisch auf der Festplatte sortiert werden, was bedeutet, dass er für die meisten Situationen eine gute Wahl ist.

22voto

Vlad Mihalcea Punkte 121171

Geclusterter Index

Ein Clustered Index ist im Grunde eine baumartig organisierte Tabelle. Anstatt die Datensätze in einem unsortierten Heap-Tabellenraum zu speichern, ist der geclusterte Index eigentlich ein B+Tree-Index, bei dem die Blattknoten, die nach dem Spaltenwert des Cluster-Schlüssels geordnet sind, die eigentlichen Tabellendatensätze speichern, wie im folgenden Diagramm dargestellt.

Clustered Index

Der Clustered Index ist die Standardtabellenstruktur in SQL Server und MySQL. Während MySQL einen versteckten Cluster-Index hinzufügt, auch wenn eine Tabelle keinen Primärschlüssel hat, baut SQL Server immer einen Cluster-Index auf, wenn eine Tabelle eine Primärschlüsselspalte hat. Andernfalls wird der SQL Server als Heap-Tabelle gespeichert.

Der geclusterte Index kann Abfragen beschleunigen, die Datensätze nach dem Schlüssel des geclusterten Index filtern, wie die üblichen CRUD-Anweisungen. Da sich die Datensätze in den Leaf Nodes befinden, gibt es keine zusätzliche Suche nach zusätzlichen Spaltenwerten, wenn Datensätze nach ihren Primärschlüsselwerten gesucht werden.

Wenn Sie zum Beispiel die folgende SQL-Abfrage auf SQL Server ausführen:

SELECT PostId, Title
FROM Post
WHERE PostId = ? 

Sie können sehen, dass der Ausführungsplan eine Clustered Index Seek-Operation verwendet, um den Blattknoten zu finden, der die Post Datensatz, und es sind nur zwei logische Lesevorgänge erforderlich, um die Clustered Index-Knoten zu scannen:

|StmtText                                                                             |
|-------------------------------------------------------------------------------------|
|SELECT PostId, Title FROM Post WHERE PostId = @P0                                    |
|  |--Clustered Index Seek(OBJECT:([high_performance_sql].[dbo].[Post].[PK_Post_Id]), |
|     SEEK:([high_performance_sql].[dbo].[Post].[PostID]=[@P0]) ORDERED FORWARD)      | 

Table 'Post'. Scan count 0, logical reads 2, physical reads 0

Nicht-geclusterter Index

Da der geclusterte Index in der Regel anhand der Werte der Primärschlüsselspalte erstellt wird, müssen Sie einen sekundären, nicht geclusterten Index hinzufügen, wenn Sie Abfragen beschleunigen möchten, die eine andere Spalte verwenden.

Der Sekundärindex speichert den Wert des Primärschlüssels in seinen Blattknoten, wie im folgenden Diagramm dargestellt:

Non-Clustered Index

Wenn wir also einen sekundären Index für die Datei Title Spalte der Post Tisch:

CREATE INDEX IDX_Post_Title on Post (Title)

Und wir führen die folgende SQL-Abfrage aus:

SELECT PostId, Title
FROM Post
WHERE Title = ? 

Wir können sehen, dass eine Index-Suchoperation verwendet wird, um den Blattknoten in der IDX_Post_Title Index, der die gewünschte SQL-Abfrageprojektion liefern kann:

|StmtText                                                                      |
|------------------------------------------------------------------------------|
|SELECT PostId, Title FROM Post WHERE Title = @P0                              |
|  |--Index Seek(OBJECT:([high_performance_sql].[dbo].[Post].[IDX_Post_Title]),|
|     SEEK:([high_performance_sql].[dbo].[Post].[Title]=[@P0]) ORDERED FORWARD)|

Table 'Post'. Scan count 1, logical reads 2, physical reads 0

Da die damit verbundenen PostId Der Wert der Primärschlüsselspalte wird in der IDX_Post_Title Leaf Node, benötigt diese Abfrage keine zusätzliche Suche, um den Post Zeile im geclusterten Index.

5voto

marvelTracker Punkte 4035

Geclusterter Index

Geclusterte Indizes sortieren und speichern die Datenzeilen in der Tabelle oder Ansicht auf der Grundlage ihrer Schlüsselwerte. Dies sind die Spalten, die in der Indexdefinition enthalten sind. Es kann nur einen geclusterten Index pro Tabelle geben, da die Datenzeilen selbst nur in einer Reihenfolge sortiert werden können.

Die Datenzeilen in einer Tabelle werden nur dann in sortierter Reihenfolge gespeichert, wenn die Tabelle einen geclusterten Index enthält. Wenn eine Tabelle einen geclusterten Index hat, nennt man sie eine geclusterte Tabelle. Wenn eine Tabelle keinen Cluster-Index hat, werden ihre Datenzeilen in einer ungeordneten Struktur gespeichert, die als Heap bezeichnet wird.

Nicht geclustert

Nicht geclusterte Indizes haben eine von den Datenzeilen getrennte Struktur. Ein nicht geclusterter Index enthält die Schlüsselwerte des nicht geclusterten Index und jeder Schlüsselwerteintrag hat einen Zeiger auf die Datenzeile, die den Schlüsselwert enthält. Der Zeiger von einer Indexzeile in einem nicht geclusterten Index auf eine Datenzeile wird als Zeilenlokator bezeichnet. Die Struktur des Zeilenlokators hängt davon ab, ob die Datenseiten in einem Heap oder in einer geclusterten Tabelle gespeichert sind. Bei einem Heap ist ein Zeilenlokator ein Zeiger auf die Zeile. Bei einer geclusterten Tabelle ist der Zeilenlokator der geclusterte Indexschlüssel.

Sie können Nicht-Schlüsselspalten zur Blattebene des nicht geclusterten Index hinzufügen, um bestehende Indexschlüsselgrenzen zu umgehen und vollständig abgedeckte, indizierte Abfragen auszuführen. Weitere Informationen finden Sie unter Erstellen von Indizes mit eingeschlossenen Spalten. Details zu Indexschlüsselgrenzen finden Sie unter Maximale Kapazitätsangaben für SQL Server.

Referenz: https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described

5voto

xxks-kkk Punkte 1961

Ich möchte Ihnen eine Lehrbuchdefinition des Begriffs "Clustering Index" anbieten, die aus 15.6.1 von Datenbank-Systeme: Das vollständige Buch :

Wir können auch von Clustering-Indizes die Indizes für ein oder mehrere Attribute sind, so dass alle Tupel mit einem festen Wert für den Suchschlüssel dieses Indexes in etwa so vielen Blöcken erscheinen, wie sie aufnehmen können.

Um die Definition zu verstehen, werfen wir einen Blick auf das Beispiel 15.10 aus dem Lehrbuch:

Eine Beziehung R(a,b) die nach Attributen sortiert ist a und in dieser gespeichert Reihenfolge, in Blöcken gepackt, ist sicherlich geclustert. Ein Index auf a ist eine Clustering-Index, da für eine gegebene a -Wert a1, alle Tupel mit diesem Wert für a sind aufeinanderfolgend. Sie erscheinen also gepackt in Blöcken gepackt, mit Ausnahme möglicherweise des ersten und letzten Blocks, die a -Wert a1, wie in Abb.15.14 vorgeschlagen. Ein Index auf b ist jedoch unwahrscheinlich, da die Tupel mit einem festen Wert b -Wert wird über die gesamte Datei verteilt, es sei denn, die Werte von a y b sind sehr eng miteinander verbunden.

Fig 15.14

Beachten Sie, dass die Definition nicht vorschreibt, dass die Datenblöcke auf der Festplatte zusammenhängend sein müssen; sie besagt nur, dass Tupel mit dem Suchschlüssel in so wenige Datenblöcke wie möglich gepackt werden.

Ein verwandtes Konzept ist Clusterrelation . Eine Beziehung ist "geclustert", wenn ihre Tupel in so wenige Blöcke gepackt sind, wie diese Tupel aufnehmen können. Mit anderen Worten: Wenn ein Plattenblock Tupel aus verschiedenen Relationen enthält, dann können diese Relationen nicht geclustert werden (d.h. es gibt einen besser gepackten Weg, eine solche Relation zu speichern, indem die Tupel dieser Relation aus anderen Plattenblöcken mit den Tupeln, die nicht zu der Relation im aktuellen Plattenblock gehören, ausgetauscht werden). Offensichtlich, R(a,b) im obigen Beispiel ist geclustert.

Um zwei Konzepte miteinander zu verbinden, kann eine geclusterte Beziehung einen Clustering-Index und einen Non-Clustering-Index haben. Bei nicht geclusterten Beziehungen ist ein Clustering-Index jedoch nicht möglich, es sei denn, der Index wird auf dem Primärschlüssel der Beziehung aufgebaut.

Der Begriff "Cluster" wird auf allen Abstraktionsebenen der Datenbankspeicherung verwendet (drei Abstraktionsebenen: Tupel, Blöcke, Datei). Ein Konzept namens " Sammeldatei ", das beschreibt, ob eine Datei (eine Abstraktion für eine Gruppe von Blöcken (ein oder mehrere Festplattenblöcke)) Tupel aus einer Relation oder aus verschiedenen Relationen enthält. Es hat nichts mit dem Clustering-Index-Konzept zu tun, da es sich auf Dateiebene befindet.

Allerdings sind einige Lehrmaterial definiert den Clustering-Index gerne auf der Grundlage der Definition der Clusterdatei. Diese beiden Arten von Definitionen sind auf der Ebene der Cluster-Relation gleich, unabhängig davon, ob sie die Cluster-Relation in Form von Datenplattenblöcken oder Dateien definieren. Aus dem Link in diesem Absatz,

Ein Index auf Attribut(en) A in einer Datei ist ein Clustering-Index, wenn: alle Tupel mit dem Attributwert A = a sequentiell (= fortlaufend) in der Datei gespeichert sind

Die fortlaufende Speicherung von Tupeln ist dasselbe wie die Aussage "Tupel werden in so wenige Blöcke wie möglich gepackt" (mit dem kleinen Unterschied, dass sich das eine auf die Datei und das andere auf die Festplatte bezieht). Das liegt daran, dass die fortlaufende Speicherung von Tupeln der Weg ist, um "in ungefähr so wenige Blöcke wie möglich gepackt" zu erreichen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X