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?

1292voto

Shiraz Bhaiji Punkte 62129

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

Bei einem nicht geclusterten Index gibt es eine zweite Liste, die Zeiger auf die physischen Zeilen enthält. Sie können viele nicht geclusterte Indizes haben, obwohl jeder neue Index die Zeit erhöht, die zum Schreiben neuer Datensätze benötigt wird.

Es ist im Allgemeinen schneller, aus einem geclusterten Index zu lesen, wenn Sie alle Spalten zurückbekommen wollen. Sie müssen nicht erst in den Index und dann in die Tabelle gehen.

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

625voto

Ein geclusterter Index bedeutet, dass Sie die Datenbank anweisen, nahe beieinander liegende Werte tatsächlich nahe beieinander auf der Festplatte zu speichern. Dies hat den Vorteil, dass Datensätze, die in einen bestimmten Bereich von geclusterten Indexwerten fallen, schnell gescannt und abgerufen werden können.

Ein Beispiel: Sie haben zwei Tabellen, Kunde und Auftrag:

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

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

Wenn Sie schnell alle Bestellungen eines bestimmten Kunden abrufen möchten, können Sie einen geclusterten Index für die Spalte "CustomerID" der Tabelle Order erstellen. Auf diese Weise werden die Datensätze mit der gleichen Kunden-ID physisch nahe beieinander auf der Festplatte gespeichert (geclustert), was ihren Abruf beschleunigt.

P.S. Der Index auf CustomerID wird natürlich nicht eindeutig sein, so dass Sie entweder ein zweites Feld hinzufügen müssen, um den Index "eindeutig" zu machen, oder die Datenbank das für Sie erledigen lassen, aber das ist eine andere Geschichte.

Bezüglich mehrerer Indizes. Sie können nur einen geclusterten Index pro Tabelle haben, da dieser definiert, wie die Daten physisch angeordnet sind. Wenn Sie eine Analogie wünschen, stellen Sie sich einen großen Raum mit vielen Tabellen darin vor. Sie können diese Tische entweder zu mehreren Reihen anordnen oder sie alle zu einem großen Konferenztisch zusammenziehen, aber nicht beides gleichzeitig. Eine Tabelle kann weitere Indizes haben, die dann auf die Einträge im Cluster-Index verweisen, der wiederum angibt, wo die eigentlichen Daten zu finden sind.

361voto

Martin Smith Punkte 417623

In SQL Server sind zeilenorientierte Indizes, sowohl geclusterte als auch nicht geclusterte Indizes, als B-Bäume organisiert.

enter image description here

( Bildquelle )

Der Hauptunterschied zwischen geclusterten Indizes und nicht geclusterten Indizes besteht darin, dass die Blattebene des geclusterten Indexes ist den Tisch. Dies hat zwei Auswirkungen.

  1. Die Zeilen auf den Blattseiten des geclusterten Index enthalten immer etwas für jede der (nicht-dichten) Spalten in der Tabelle (entweder den Wert oder einen Zeiger auf den tatsächlichen Wert).
  2. Der geclusterte Index ist die primäre Kopie einer Tabelle.

Nicht geclusterte Indizes können auch Punkt 1 erfüllen, indem sie die INCLUDE Klausel (seit SQL Server 2005), um explizit alle Nicht-Schlüsselspalten einzuschließen, aber sie sind 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. Die Indexseiten der oberen Ebene enthalten Werte für die Schlüsselspalten A, B und die Seiten der Blattebene mit A, B, C, D

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

Das obige Zitat aus den SQL Server-Büchern im Internet sorgt für viel Verwirrung

Meiner Meinung nach wäre es viel besser, es so zu formulieren.

Es kann nur einen geclusterten Index pro Tabelle geben, da die Blattebenen-Zeilen des geclusterten Indexes sind die Tabellenzeilen.

Das Online-Zitat des Buches ist nicht falsch, aber Sie sollten sich darüber im Klaren sein, dass die "Sortierung" sowohl von nicht geclusterten als auch von geclusterten 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 weit verbreitete Annahme, dass bei einem geclusterten Index die Zeilen physisch immer in der gleichen Reihenfolge wie der Index auf der Platte gespeichert werden Schlüssel falsch ist.

Dies wäre eine absurde Umsetzung. Wenn zum Beispiel eine Zeile in der Mitte einer 4-GB-Tabelle eingefügt wird, macht SQL Server no 2 GB an Daten in der Datei nach oben kopieren müssen, um Platz für die neu eingefügte Zeile zu schaffen.

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

Die verlinkte Seitenkette könnte z.B. lauten 1:2000 <-> 1:157 <-> 1:7053

Bei einer Seitenteilung wird eine neue Seite von einer beliebigen Stelle in der Dateigruppe aus zugewiesen (entweder von einem gemischten Extent für kleine Tabellen oder einem nicht leeren einheitlichen Extent, der zu diesem Objekt gehört, oder einem neu zugewiesenen einheitlichen Extent). Wenn die Dateigruppe mehr als eine Datei enthält, muß diese nicht einmal in derselben Datei liegen.

Das Ausmaß, in dem die logische Reihenfolge und die Kontiguität von der idealisierten physischen Version abweichen, ist der Grad der logischen Fragmentierung.

In einer neu erstellten Datenbank mit einer einzigen 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

Überprüfen Sie dann 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 durchwachsen. Die erste Zeile in der Reihenfolge der Schlüssel (mit Wert 1 - unten mit einem Pfeil hervorgehoben) befand sich fast auf der letzten physischen Seite.

enter image description here

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

Nach der Ausführung

ALTER INDEX ix ON T REBUILD;

Ich habe folgendes erhalten

enter image description here

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

Nicht geclusterte Indizes können entweder auf einem Heap oder einem geclusterten Index aufgebaut werden. Sie enthalten immer einen Zeilenlokator zurück zur Basistabelle. Im Falle eines Heaps ist dies ein physischer Zeilenbezeichner (rid) und besteht aus drei Komponenten (Datei:Seite: Slot). Im Falle eines Clustered Index ist der Zeilenlokator logisch (der Schlüssel des Clustered Index).

Im letzteren Fall, wenn der nicht geclusterte Index die CI-Schlüsselspalte(n) entweder als NCI-Schlüsselspalten oder INCLUDE -d Spalten, dann wird nichts hinzugefügt. Andernfalls wird die fehlende(n) CI-Schlüsselspalte(n) stillschweigend zur NCI hinzugefügt.

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

Geclusterte Indizes erhalten eine uniquifier für alle Zeilen mit Schlüsselwerten, die eine bestehende Zeile duplizieren, hinzugefügt. Dies ist nur eine aufsteigende Ganzzahl.

Bei nicht geclusterten Indizes, die nicht als eindeutig deklariert sind, fügt SQL Server den Zeilenlokator stillschweigend in den nicht geclusterten Indexschlüssel ein. Dies gilt für alle Zeilen, nicht nur für die, die tatsächlich Duplikate sind.

Die Nomenklatur "geclustert" vs. "nicht geclustert" wird auch für Indizes von Spaltenspeichern verwendet. Das Papier Erweiterungen für SQL Server-Spaltenspeicher Staaten

Obwohl die Daten des Spaltenspeichers nicht wirklich nach einem Schlüssel "geclustert" sind, haben wir haben wir uns entschieden, die traditionelle SQL Server-Konvention beizubehalten und den den Primärindex als Cluster-Index zu bezeichnen.

187voto

kmote Punkte 15424

Mir ist klar, dass dies eine sehr alte Frage ist, aber ich dachte, ich würde eine Analogie zur Veranschaulichung der guten Antworten oben anbieten.

GECLUSTERTER INDEX

Wenn Sie eine öffentliche Bibliothek betreten, werden Sie feststellen, dass die Bücher alle in einer bestimmten Reihenfolge angeordnet sind (höchstwahrscheinlich nach dem Dewey-Dezimalsystem, kurz DDS). Dies entspricht dem "geclusterter Index" der Bücher. Wenn die DDS-Nummer für das gewünschte Buch lautet 005.7565 F736s beginnen Sie mit der Reihe von Bücherregalen, die die Bezeichnung 001-099 oder so ähnlich. (Dieses Endkappenzeichen am Ende des Stapels entspricht einem "Zwischenknoten" im Index). Schließlich würden Sie bis zu dem speziellen Regal mit der Bezeichnung 005.7450 - 005.7600 dann scannen Sie, bis Sie das Buch mit der angegebenen DDS-Nummer gefunden haben, und dann Sie haben Ihr Buch gefunden.

NICHT-GECLUSTERTER INDEX

Wenn Sie aber nicht mit der DDS-Nummer Ihres Buches in die Bibliothek kommen, dann brauchen Sie einen zweiten Index, der Ihnen hilft. Früher gab es im vorderen Teil der Bibliothek eine wunderbare Kommode mit Schubladen, die als "Zettelkatalog" bekannt war. Darin befanden sich Tausende von 3x5-Karten - eine für jedes Buch, sortiert in alphabetischer Reihenfolge (vielleicht nach Titel). Dies entspricht dem "nicht-geclusterter Index" . Diese Kartenkataloge waren in einer hierarchischen Struktur organisiert, so dass jede Schublade mit dem Bereich der Karten, die sie enthielt, beschriftet wurde ( Ka - Kl (z. B. der "Zwischenknoten"). Auch hier würden Sie so lange suchen, bis Sie Ihr Buch gefunden haben, aber in este Wenn Sie das Buch gefunden haben (d. h. den "Blattknoten"), haben Sie nicht das Buch selbst, sondern nur eine Karte mit einem Index Nummer (die DDS#), mit der Sie das aktuelle Buch im geclusterten Index finden können.

Natürlich würde nichts den Bibliothekar davon abhalten, alle Karten zu fotokopieren und sie in einem separaten Kartenkatalog anders zu sortieren. (In der Regel gab es mindestens zwei solcher Kataloge: einen nach Autorennamen und einen nach Titel.) Im Prinzip könnte man so viele dieser "nicht geclusterten" Karteien anlegen, wie man möchte.

74voto

Anirudh Sood Punkte 1428

Im Folgenden finden Sie einige Merkmale von geclusterten und nicht geclusterten Indizes:

Geclusterte Indizes

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

Nicht-geclusterte Indizes

  1. Nicht geclusterte Indizes sind wie einfache Indizes. Sie werden nur zum schnellen Abrufen von Daten verwendet. Sie müssen nicht unbedingt eindeutige Daten enthalten.

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