Was bedeuten Clustered- und Non-Clustered-Index eigentlich?


1118

Ich bin nur begrenzt mit DB vertraut und habe DB nur als Anwendungsprogrammierer verwendet. Ich möchte etwas über Clusteredund wissen Non clustered indexes. Ich googelte und fand:

Ein Clustered-Index ist ein spezieller Indextyp, der die Art und Weise neu ordnet, wie Datensätze in der Tabelle physisch gespeichert werden. Daher kann die Tabelle nur einen Clustered-Index haben. Die Blattknoten eines Clustered-Index enthalten die Datenseiten. Ein nicht gruppierter Index ist ein spezieller Indextyp, bei dem die logische Reihenfolge des Index nicht mit der physisch gespeicherten Reihenfolge der Zeilen auf der Festplatte übereinstimmt. Der Blattknoten eines nicht gruppierten Index besteht nicht aus den Datenseiten. Stattdessen enthalten die Blattknoten Indexzeilen.

Was ich in SO gefunden habe, war Was sind die Unterschiede zwischen einem Clustered-Index und einem Nicht-Clustered-Index? .

Kann jemand dies in einfachem Englisch erklären?

Antworten:


1116

Bei einem Clustered-Index werden die Zeilen physisch in derselben Reihenfolge wie der Index auf der Festplatte gespeichert. Daher kann es nur einen Clustered-Index geben.

Bei einem nicht gruppierten Index gibt es eine zweite Liste mit Zeigern auf die physischen Zeilen. Sie können viele nicht gruppierte Indizes haben, obwohl jeder neue Index die Zeit verlängert, die zum Schreiben neuer Datensätze benötigt wird.

Das Lesen aus einem Clustered-Index ist im Allgemeinen schneller, wenn Sie alle Spalten wiederherstellen möchten. Sie müssen nicht zuerst zum Index und dann zur Tabelle gehen.

Das Schreiben in eine Tabelle mit einem Clustered-Index kann langsamer sein, wenn die Daten neu angeordnet werden müssen.


43
Sie sollten klarstellen, was Sie unter "physisch" verstehen.
Spencer Ruport

142
physisch wie in den tatsächlichen Bits auf der Festplatte gespeichert
Peter

17
Siehe msdn "Wenn Sie eine PRIMARY KEY-Einschränkung erstellen, wird automatisch ein eindeutiger Clustered-Index für die Spalte oder Spalten erstellt, wenn noch kein Clustered-Index für die Tabelle vorhanden ist". Dies bedeutet, dass nicht dieselbe Spalte vorhanden sein muss.
Ming

46
@Pete das ist nicht der Fall. SQL Server garantiert sicherlich nicht, dass alle Datendateien in einem zusammenhängenden physischen Bereich der Festplatte angeordnet sind und keine Dateisystemfragmentierung vorliegt. Es ist nicht einmal wahr, dass ein Clustered-Index in der Datendatei in Ordnung ist. Inwieweit dies nicht der Fall ist, ist der Grad der logischen Fragmentierung.
Martin Smith

42
Nur ein kurzer Kommentar zur Sicherung von Martin Smiths Argument: Clustered-Indizes garantieren keine sequentielle Speicherung auf der Festplatte. Die genaue Verwaltung der Daten auf der Festplatte ist Aufgabe des Betriebssystems und nicht des DBMS. Es wird jedoch empfohlen, die Elemente im Allgemeinen nach dem Clustering-Schlüssel zu ordnen. Dies bedeutet, dass das Betriebssystem, wenn die Datenbank beispielsweise um 10 GB wächst, möglicherweise beschließt, diese 10 GB in 5 x 2 GB-Blöcken auf verschiedenen Teilen der Festplatte zu speichern. Eine gruppierte Tabelle mit 10 GB wird nacheinander auf jedem 2-GB-Block gespeichert. Diese 2-GB-Blöcke dürfen jedoch NICHT sequentiell sein.
Blobbles

601

Ein Clustered-Index bedeutet, dass Sie die Datenbank anweisen, nahe beieinander liegende Werte auf der Festplatte zu speichern. Dies hat den Vorteil, dass Datensätze schnell gescannt / abgerufen werden können, die in einen Bereich von Clustered-Index-Werten fallen.

Sie haben beispielsweise zwei Tabellen: Kunde und Bestellung:

Customer
----------
ID
Name
Address

Order
----------
ID
CustomerID
Price

Wenn Sie schnell alle Bestellungen eines bestimmten Kunden abrufen möchten, möchten Sie möglicherweise einen Clustered-Index für die Spalte "CustomerID" der Order-Tabelle erstellen. Auf diese Weise werden die Datensätze mit derselben Kunden-ID physisch nahe beieinander auf der Festplatte (in Clustern) gespeichert, wodurch das Abrufen beschleunigt wird.

PS Der Index für CustomerID ist offensichtlich nicht eindeutig. Sie müssen also entweder ein zweites Feld hinzufügen, um den Index zu "eindeutig" zu machen, oder die Datenbank das für Sie erledigen lassen, aber das ist eine andere Geschichte.

In Bezug auf mehrere Indizes. Sie können nur einen Clustered-Index pro Tabelle haben, da dies definiert, wie die Daten physisch angeordnet sind. Wenn Sie eine Analogie wünschen, stellen Sie sich einen großen Raum mit vielen Tischen vor. Sie können diese Tabellen entweder zu mehreren Zeilen zusammenfassen oder alle zu einer großen Konferenztabelle zusammenfassen, jedoch nicht in beide Richtungen gleichzeitig. Eine Tabelle kann andere Indizes haben. Sie zeigen dann auf die Einträge im Clustered-Index, die wiederum angeben, wo sich die tatsächlichen Daten befinden.



4
Bei einem Clustered-Index werden also die Datensätze im Index oder in der Tabelle nahe beieinander gespeichert?
Caltor

5
@Caltor Die Tabelle. Der Index ist per Definition geordnet. Zum Beispiel würde ein Baum bestellt, damit man einfach eine Adressarithmetik für die Suche durchführen kann. Die Idee des Clusters besteht darin, die Tabelle an die Leistung eines bestimmten Index anzupassen. Um klar zu sein, werden die Datensätze der Tabelle neu angeordnet, um der Reihenfolge zu entsprechen , in der sich der Index ursprünglich befindet .
FLGMwt

9
@Caltor Überhaupt nicht! In der Tat sind die Dokumentation und der Name selbst ziemlich irreführend. Ein "Clustered Index" hat wirklich wenig mit dem Index zu tun. Konzeptionell haben Sie wirklich "eine Tabelle, die auf Index x gruppiert ist ".
FLGMwt

3
JohnOrtizOrdoñez @: Sicher, man kann fast jeder , dass die gespeicherten in-Reihe, so dass keine Verwendung XML, VARCHAR(MAX)oder VARBINARY(MAX). Beachten Sie, dass es in der Regel sinnvoll, Cluster auf dem Datumsfeld macht zuerst , als ein Clustered - Index am effizientesten Bereich Scans ist, die am häufigsten auf Terminarten sind. YMMV.

317

In zeilenorientiertem SQL Server-Speicher sind sowohl Clustered- als auch Nonclustered-Indizes als B-Bäume organisiert.

Geben Sie hier die Bildbeschreibung ein

( Bildquelle )

Der wesentliche Unterschied zwischen Clustered - Indizes und nicht gruppiert Indizes ist , dass die Blattebene des gruppierten Index ist die Tabelle. Dies hat zwei Auswirkungen.

  1. Die Zeilen auf den gruppierten Indexblattseiten enthalten immer etwas für jede der (nicht spärlichen) Spalten in der Tabelle (entweder den Wert oder einen Zeiger auf den tatsächlichen Wert).
  2. Der Clustered-Index ist die primäre Kopie einer Tabelle.

Nicht geclusterte Indizes können auch Punkt 1 ausführen, indem sie die INCLUDEKlausel (Seit SQL Server 2005) verwenden, um alle Nichtschlüsselspalten explizit einzuschließen. Es handelt sich jedoch um sekundäre Darstellungen, und es gibt immer eine weitere Kopie der Daten (die Tabelle selbst).

CREATE TABLE T
(
A INT,
B INT,
C INT,
D INT
)

CREATE UNIQUE CLUSTERED INDEX ci ON T(A,B)
CREATE UNIQUE NONCLUSTERED INDEX nci ON T(A,B) INCLUDE (C,D)

Die beiden obigen Indizes sind nahezu identisch. Mit den Indexseiten der oberen Ebene, die Werte für die Schlüsselspalten enthalten, A,Bund den Seiten auf Blattebene, die Werte enthaltenA,B,C,D

Es kann nur einen Clustered-Index pro Tabelle geben, da die Datenzeilen selbst nur in einer Reihenfolge sortiert werden können.

Das obige Zitat aus den Online-Büchern von SQL Server sorgt für große Verwirrung

Meiner Meinung nach wäre es viel besser formuliert als.

Es kann nur ein Clustered - Index pro Tabelle, weil die Blattebene Reihen des Clustered - Index sind die Tabellenzeilen.

Das Online-Zitat der Bücher ist nicht falsch, aber Sie sollten sich darüber im Klaren sein, dass die "Sortierung" sowohl von nicht gruppierten als auch von gruppierten Indizes logisch und nicht physisch ist. Wenn Sie die Seiten auf Blattebene lesen, indem Sie der verknüpften Liste folgen und die Zeilen auf der Seite in Slot-Array-Reihenfolge lesen, lesen Sie die Indexzeilen in sortierter Reihenfolge, aber physisch sind die Seiten möglicherweise nicht sortiert. Die gemeinsame Überzeugung , dass mit einem Clustered - Index der Zeilen immer physikalisch auf der Festplatte in der gleichen Reihenfolge wie der Index gespeichert Schlüssel ist falsch.

Dies wäre eine absurde Implementierung. Zum Beispiel , wenn eine Zeile in die Mitte einer 4 GB - Tabelle eingefügt wird SQL Server ist nicht hat 2 GB an Daten in der Datei , um Platz für die neu eingefügte Zeile zu kopieren.

Stattdessen erfolgt eine Seitenteilung. Jede Seite auf Blattebene sowohl von gruppierten als auch von nicht gruppierten Indizes hat die Adresse ( File:Page) der nächsten und vorherigen Seite in logischer Schlüsselreihenfolge. Diese Seiten müssen weder zusammenhängend noch in Schlüsselreihenfolge sein.

zB könnte die verknüpfte Seitenkette sein 1:2000 <-> 1:157 <-> 1:7053

Wenn ein Seitenteilung erfolgt, wird eine neue Seite von einer beliebigen Stelle in der Dateigruppe zugewiesen (entweder von einer gemischten Ausdehnung für kleine Tabellen oder einer nicht leeren einheitlichen Ausdehnung, die zu diesem Objekt gehört, oder einer neu zugewiesenen einheitlichen Ausdehnung). Dies befindet sich möglicherweise nicht einmal in derselben Datei, wenn die Dateigruppe mehr als eine enthält.

Der Grad, in dem sich die logische Reihenfolge und Kontiguität von der idealisierten physischen Version unterscheidet, ist der Grad der logischen Fragmentierung.

In einer neu erstellten Datenbank mit einer einzelnen Datei habe ich Folgendes ausgeführt.

CREATE TABLE T
  (
     X TINYINT NOT NULL,
     Y CHAR(3000) NULL
  );

CREATE CLUSTERED INDEX ix
  ON T(X);

GO

--Insert 100 rows with values 1 - 100 in random order
DECLARE @C1 AS CURSOR,
        @X  AS INT

SET @C1 = CURSOR FAST_FORWARD
FOR SELECT number
    FROM   master..spt_values
    WHERE  type = 'P'
           AND number BETWEEN 1 AND 100
    ORDER  BY CRYPT_GEN_RANDOM(4)

OPEN @C1;

FETCH NEXT FROM @C1 INTO @X;

WHILE @@FETCH_STATUS = 0
  BEGIN
      INSERT INTO T (X)
      VALUES        (@X);

      FETCH NEXT FROM @C1 INTO @X;
  END

Dann überprüfte das Seitenlayout mit

SELECT page_id,
       X,
       geometry::Point(page_id, X, 0).STBuffer(1)
FROM   T
       CROSS APPLY sys.fn_PhysLocCracker( %% physloc %% )
ORDER  BY page_id

Die Ergebnisse waren überall. Die erste Zeile in Schlüsselreihenfolge (mit dem Wert 1 - hervorgehoben durch den Pfeil unten) befand sich fast auf der letzten physischen Seite.

Geben Sie hier die Bildbeschreibung ein

Die Fragmentierung kann reduziert oder entfernt werden, indem ein Index neu erstellt oder organisiert wird, um die Korrelation zwischen logischer und physischer Reihenfolge zu erhöhen.

Nach dem Rennen

ALTER INDEX ix ON T REBUILD;

Ich habe folgendes

Geben Sie hier die Bildbeschreibung ein

Wenn die Tabelle keinen Clustered-Index hat, wird sie als Heap bezeichnet.

Nicht gruppierte Indizes können entweder auf einem Heap- oder einem gruppierten Index erstellt werden. Sie enthalten immer einen Zeilenlokator zurück zur Basistabelle. Im Fall eines Heaps ist dies eine physische Zeilenkennung (rid) und besteht aus drei Komponenten (Datei: Seite: Steckplatz). Bei einem Clustered-Index ist der Zeilenlokator logisch (der Clustered-Indexschlüssel).

Für den letzteren Fall wird INCLUDEnichts hinzugefügt, wenn der nicht gruppierte Index die CI-Schlüsselspalte (n) entweder als NCI-Schlüsselspalten oder als -d-Spalten enthält. Andernfalls werden die fehlenden CI-Schlüsselspalten stillschweigend zur NCI hinzugefügt.

SQL Server stellt immer sicher, dass die Schlüsselspalten für beide Indextypen eindeutig sind. Der Mechanismus, mit dem dies für nicht als eindeutig deklarierte Indizes erzwungen wird, unterscheidet sich jedoch zwischen den beiden Indextypen.

Clustered-Indizes werden uniquifierfür alle Zeilen mit Schlüsselwerten hinzugefügt, die eine vorhandene Zeile duplizieren. Dies ist nur eine aufsteigende Ganzzahl.

Bei nicht gruppierten Indizes, die nicht als eindeutig deklariert sind, fügt SQL Server den Zeilen-Locator stillschweigend dem nicht gruppierten Indexschlüssel hinzu. Dies gilt für alle Zeilen, nicht nur für diejenigen, die tatsächlich Duplikate sind.

Die Nomenklatur "Clustered vs Nonclustered" wird auch für Spaltenspeicherindizes verwendet. Die Papiere Erweiterungen SQL Server Column Stores Staaten

Obwohl die Spaltenspeicherdaten auf keinem Schlüssel wirklich "geclustert" sind, haben wir uns entschlossen, die traditionelle SQL Server-Konvention beizubehalten, den Primärindex als Clustered-Index zu bezeichnen.


8
@brainstorm ja das ist mir bewusst. Wahrscheinlich liegt das an der Formulierung auf dieser MSDN-Seite, aber um zu sehen, dass die Formulierung dort etwas irreführend ist, müssen Sie sich nur die Fragmentierungsthemen
Martin Smith,

12
@brainstorm: Es ist erstaunlich, wie einige falsche Aussagen als Evangelium wiederholt werden. Ein Cluster zeigt an, dass es zumindest im Hinblick auf sequentielle Lesevorgänge "wünschenswert" wäre, die Zeilen physisch in derselben Reihenfolge wie der Index auf der Festplatte zu speichern , aber das ist weit davon entfernt zu sagen, dass dies tatsächlich dazu führt, dass sie tatsächlich gespeichert werden so gelagert werden.
Supercat

5
@MartinSmith Ich habe die Ergebnisse Ihres Tests am reproduziert und bestätigt SQL Server 2014. Ich erhalte 95%nach der ersten Einfügung eine Fragmentierung des Index. Nach index rebuildder Fragmentierung wurde 0%und die Werte geordnet. Ich frage mich, können wir das sagen The only time the data rows in a table are stored in sorted order is when its clustered index fragmentation is 0?
Gotqn

8
@ MartinSmith Nun, Sir, das ist eine Antwort. Ich würde es gerne ganz oben auf der Antwortliste sehen, aber so wie es geht, wird "schnell und einfach" positiv bewertet.
Vaitrafra

5
@ Manachi Diese Antwort wurde 5 Jahre nach der ursprünglichen Frage gegeben. Der Zweck ist es, einige irreführende Aspekte dieser Antworten zu korrigieren. Die (jetzt 8 Jahre alten) Launen des OP gehen mich nichts an. Andere Leser schätzen möglicherweise eine Ansicht auf niedrigerer Ebene.
Martin Smith

150

Mir ist klar, dass dies eine sehr alte Frage ist, aber ich dachte, ich würde eine Analogie anbieten, um die feinen Antworten oben zu veranschaulichen.

CLUSTERED INDEX

Wenn Sie eine öffentliche Bibliothek betreten, werden Sie feststellen, dass alle Bücher in einer bestimmten Reihenfolge angeordnet sind (höchstwahrscheinlich das Dewey-Dezimalsystem oder DDS). Dies entspricht dem "Clustered Index" der Bücher. Wenn die DDS-Nummer für das gewünschte Buch 005.7565 F736slautet, suchen Sie zunächst die beschriftete Bücherregalreihe 001-099oder ähnliches. (Dieses Endkappenzeichen am Ende des Stapels entspricht einem "Zwischenknoten" im Index.) Schließlich würden Sie einen Drilldown zu dem angegebenen Regal durchführen 005.7450 - 005.7600und dann scannen, bis Sie das Buch mit der angegebenen DDS-Nummer gefunden haben, und bei An diesem Punkt haben Sie Ihr Buch gefunden.

NICHT CLUSTERED INDEX

Wenn Sie jedoch nicht mit der DDS-Nummer Ihres Buches in die Bibliothek gekommen wären, benötigen Sie einen zweiten Index, der Sie unterstützt. In den alten Tagen fand man an der Vorderseite der Bibliothek ein wunderbares Schubladenbüro, das als "Kartenkatalog" bekannt ist. Darin befanden sich Tausende von 3x5 Karten - eine für jedes Buch, sortiert in alphabetischer Reihenfolge (vielleicht nach Titel). Dies entspricht dem "nicht gruppierten Index" . Diese Kartenkataloge waren in einer hierarchischen Struktur organisiert, so dass jede Schublade mit dem darin enthaltenen Kartenbereich gekennzeichnet war ( Ka - Klz. B. dem "Zwischenknoten"). Noch einmal, Sie würden einen Drilldown durchführen, bis Sie Ihr Buch gefunden haben. In diesem Fall haben Sie jedoch das Buch selbst nicht, sobald Sie es gefunden haben (dh den "Blattknoten").Indexnummer (die DDS-Nummer), mit der Sie das aktuelle Buch im Clustered-Index finden können.

Natürlich würde nichts den Bibliothekar davon abhalten, alle Karten zu fotokopieren und in einer anderen Reihenfolge in einem separaten Kartenkatalog zu sortieren. (In der Regel gab es mindestens zwei solcher Kataloge: einen nach Autorennamen und einen nach Titel.) Grundsätzlich können Sie so viele dieser "nicht gruppierten" Indizes haben, wie Sie möchten.


2
Ich könnte diese Analogie vielleicht erweitern, um "eingeschlossene" Spalten zu beschreiben , die mit nicht gruppierten Indizes verwendet werden können: Man könnte sich eine Karte im Kartenkatalog vorstellen, die mehr als nur ein einziges Buch enthält, sondern stattdessen eine Liste aller veröffentlichten Versionen des Buches, numerisch nach Veröffentlichungsdatum geordnet. Genau wie in einer "eingeschlossenen Spalte" werden diese Informationen nur auf Blattebene gespeichert (wodurch die Anzahl der Karten verringert wird, die der Bibliothekar erstellen muss).
kmote

1
tolle Analogie - hilft wirklich, es zu visualisieren!
Denis

71

Nachfolgend finden Sie einige Merkmale von Clustered- und Nicht-Clustered-Indizes:

Clustered-Indizes

  1. Clustered-Indizes sind Indizes, die die Zeilen in einer SQL-Tabelle eindeutig identifizieren.
  2. Jede Tabelle kann genau einen Clustered-Index haben.
  3. Sie können einen Clustered-Index erstellen, der mehr als eine Spalte abdeckt. Zum Beispiel : create Index index_name(col1, col2, col.....).
  4. Standardmäßig verfügt eine Spalte mit einem Primärschlüssel bereits über einen Clustered-Index.

Nicht gruppierte Indizes

  1. Nicht gruppierte Indizes sind wie einfache Indizes. Sie werden nur zum schnellen Abrufen von Daten verwendet. Ich bin mir nicht sicher, ob ich eindeutige Daten habe.

34
Eine geringfügige Korrektur von Punkt 1. Ein Clustered-Index identifiziert die Zeilen in einer SQL-Tabelle nicht unbedingt eindeutig. Das ist die Funktion eines PRIMARY KEY
Nigel

4
@Nigel, ein PRIMARY KEY oder ein EINZIGARTIGER INDEX?
Anar Khalilov

praktische und direkte Antwort, danke @Anirudh Sood
Oscar Romero

50

Eine sehr einfache, nicht technische Faustregel wäre, dass Clustered-Indizes normalerweise für Ihren Primärschlüssel (oder zumindest eine eindeutige Spalte) und Nicht-Clustered-Indizes für andere Situationen (möglicherweise einen Fremdschlüssel) verwendet werden. . In der Tat erstellt SQL Server standardmäßig einen Clustered-Index für Ihre Primärschlüsselspalte (n). Wie Sie erfahren haben, bezieht sich der Clustered-Index auf die Art und Weise, wie Daten physisch auf der Festplatte sortiert werden. Dies bedeutet, dass er in den meisten Situationen eine gute Allround-Wahl ist.


47

Clustered Index

Ein Clustered-Index bestimmt die physische Reihenfolge von DATA in einer Tabelle. Aus diesem Grund hat eine Tabelle nur 1 Clustered-Index.

  • " Wörterbuch " Kein anderer Index erforderlich, es ist bereits Index nach Wörtern

Nonclustered Index

Ein nicht gruppierter Index ist analog zu einem Index in einem Buch. Die Daten werden an einem Ort gespeichert. Der Index wird an einer anderen Stelle gespeichert und der Index verfügt über Zeiger auf den Speicherort der Daten. Aus diesem Grund verfügt eine Tabelle über mehr als 1 nicht gruppierten Index.

  • " Chemiebuch " beim Starren gibt es einen separaten Index, um auf die Position des Kapitels hinzuweisen, und am "ENDE" gibt es einen weiteren Index, der auf die gemeinsame Position der WORTE verweist

6

Clustered Index

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 sortiert 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 Zeilenlokator ein Zeiger auf die Zeile. Bei einer Clustertabelle ist der Zeilenlokator der Clustered-Indexschlüssel.

Sie können der Blattebene des nicht gruppierten Index Spalten ohne Schlüssel hinzufügen, um vorhandene Indexschlüsselbeschränkungen zu umgehen und vollständig abgedeckte, indizierte Abfragen auszuführen. Weitere Informationen finden Sie unter Erstellen von Indizes mit eingeschlossenen Spalten. Einzelheiten zu den Grenzwerten für Indexschlüssel finden Sie unter Angaben zur maximalen Kapazität für SQL Server.

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


4

Lassen Sie mich eine Lehrbuchdefinition zum Thema "Clustering-Index" anbieten, die aus 15.6.1 von Database Systems: The Complete Book stammt :

Wir können auch von Clustering-Indizes sprechen , bei denen es sich um Indizes für ein Attribut oder Attribute handelt, sodass alle Tupel mit einem festen Wert für den Suchschlüssel dieses Index auf ungefähr so ​​wenigen Blöcken erscheinen, wie sie enthalten können.

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

Eine Beziehung R(a,b), die nach Attributen sortiert aund in dieser Reihenfolge in Blöcken gepackt ist, ist sicherlich clusterd. Ein Index auf aist ein Clustering-Index, da für einen gegebenen aWert a1 alle Tupel mit diesem Wert für aaufeinanderfolgend sind. Sie erscheinen daher in Blöcken gepackt, mit Ausnahme der ersten und letzten Blöcke, die den aWert a1 enthalten , wie in Abb. 15.14 vorgeschlagen. Es ist jedoch unwahrscheinlich, dass ein Index für b Clustering ist, da die Tupel mit einem festen bWert über die gesamte Datei verteilt werden, es sei denn, die Werte von aund bsind sehr eng korreliert.

Abb. 15.14

Beachten Sie, dass die Definition nicht erzwingt, dass die Datenblöcke auf der Festplatte zusammenhängend sein müssen. Es heißt nur, dass Tupel mit dem Suchschlüssel in so wenige Datenblöcke wie möglich gepackt werden.

Ein verwandtes Konzept ist die Clusterbeziehung . Eine Relation wird "gruppiert", wenn ihre Tupel in ungefähr so ​​wenige Blöcke gepackt sind, wie diese Tupel möglicherweise enthalten können. Mit anderen Worten, wenn es aus Sicht eines Plattenblocks Tupel aus verschiedenen Beziehungen enthält, können diese Beziehungen nicht geclustert werden (dh es gibt eine umfassendere Möglichkeit, eine solche Beziehung zu speichern, indem die Tupel dieser Beziehung aus anderen Plattenblöcken gegen die ausgetauscht werden Tupel, die nicht zur Beziehung im aktuellen Plattenblock gehören). Das R(a,b)obige Beispiel ist eindeutig gruppiert.

Um zwei Konzepte miteinander zu verbinden, kann eine Clusterbeziehung einen Clusterindex und einen Nichtclusterindex haben. Bei nicht gruppierten Beziehungen ist ein Clustering-Index jedoch nur möglich, wenn der Index auf dem Primärschlüssel der Beziehung basiert.

"Cluster" als Wort wird über alle Abstraktionsebenen der Datenbankspeicherseite (drei Abstraktionsebenen: Tupel, Blöcke, Datei) gespammt. Ein Konzept namens " Clustered File ", das beschreibt, ob eine Datei (eine Abstraktion für eine Gruppe von Blöcken (ein oder mehrere Plattenblöcke)) Tupel aus einer Beziehung oder verschiedenen Beziehungen enthält. Es bezieht sich nicht auf das Clustering-Index-Konzept, da es sich auf Dateiebene befindet.

Einige Lehrmaterialien definieren jedoch gerne den Clustering-Index basierend auf der Definition der Clustered-Datei. Diese beiden Arten von Definitionen sind auf der Ebene der Cluster-Relationen gleich, unabhängig davon, ob sie die Cluster-Relation als Datenplattenblock oder -datei definieren. Aus dem Link in diesem Absatz,

Ein Index für Attribut (e) A in einer Datei ist ein Clustering-Index, wenn: Alle Tupel mit dem Attributwert A = a nacheinander (= nacheinander) in der Datendatei gespeichert werden

Das fortlaufende Speichern von Tupeln entspricht der Aussage "Tupel werden in ungefähr so ​​wenige Blöcke gepackt, wie diese Tupel möglicherweise enthalten können" (mit geringfügigen Unterschieden bei einer Datei, die andere von der Festplatte). Dies liegt daran, dass das fortlaufende Speichern von Tupeln der Weg ist, um "in ungefähr so ​​wenige Blöcke gepackt zu werden, wie diese Tupel möglicherweise enthalten können".


3

Clustered Index: Durch die Einschränkung des Primärschlüssels wird automatisch ein Clustered Index erstellt, wenn in der Tabelle noch kein Clustered Index vorhanden ist. Die tatsächlichen Daten des Clustered-Index können auf Blattebene des Index gespeichert werden.

Nicht gruppierter Index: Die tatsächlichen Daten des nicht gruppierten Index werden nicht direkt am Blattknoten gefunden, sondern müssen einen zusätzlichen Schritt ausführen, da nur Werte von Zeilenlokalisierern auf tatsächliche Daten verweisen. Nicht gruppierter Index kann nicht als gruppierter Index sortiert werden. Es können mehrere nicht gruppierte Indizes pro Tabelle vorhanden sein. Dies hängt tatsächlich von der von uns verwendeten SQL Server-Version ab. Grundsätzlich erlaubt SQL Server 2005 249 nicht gruppierte Indizes und für obige Versionen wie 2008, 2016 999 nicht gruppierte Indizes pro Tabelle.


2

Clustered Index - Ein Clustered Index definiert die Reihenfolge, in der Daten physisch in einer Tabelle gespeichert werden. Tabellendaten können nur auf eine Weise sortiert werden, daher kann es nur einen Clustered-Index pro Tabelle geben. In SQL Server erstellt die Primärschlüsseleinschränkung automatisch einen Clustered-Index für diese bestimmte Spalte.

Nicht gruppierter Index- Ein nicht gruppierter Index sortiert die physischen Daten in der Tabelle nicht. Tatsächlich wird ein nicht gruppierter Index an einem Ort und Tabellendaten an einem anderen Ort gespeichert. Dies ähnelt einem Lehrbuch, in dem sich der Buchinhalt an einer Stelle und der Index an einer anderen befindet. Dies ermöglicht mehr als einen nicht gruppierten Index pro Tabelle. Es ist wichtig zu erwähnen, dass die Daten innerhalb der Tabelle nach einem gruppierten Index sortiert werden. Innerhalb des nicht gruppierten Index werden die Daten jedoch in der angegebenen Reihenfolge gespeichert. Der Index enthält Spaltenwerte, für die der Index erstellt wird, und die Adresse des Datensatzes, zu dem der Spaltenwert gehört. Wenn eine Abfrage für eine Spalte ausgegeben wird, für die der Index erstellt wird, geht die Datenbank zuerst zum Index und sucht nach die Adresse der entsprechenden Zeile in der Tabelle. Es wird dann zu dieser Zeilenadresse gehen und andere Spaltenwerte abrufen. Aufgrund dieses zusätzlichen Schritts sind nicht gruppierte Indizes langsamer als gruppierte Indizes

Unterschiede zwischen Clustered- und Non-Clustered-Index

  1. Es kann nur einen Clustered-Index pro Tabelle geben. Sie können jedoch mehrere nicht gruppierte Indizes für eine einzelne Tabelle erstellen.
  2. Clustered-Indizes sortieren nur Tabellen. Daher verbrauchen sie keinen zusätzlichen Speicherplatz. Nicht gruppierte Indizes werden an einem von der eigentlichen Tabelle getrennten Ort gespeichert und beanspruchen mehr Speicherplatz.
  3. Clustered-Indizes sind schneller als Nicht-Clustered-Indizes, da sie keinen zusätzlichen Suchschritt erfordern.

Weitere Informationen finden Sie in diesem Artikel.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.