Ich bin nur begrenzt mit DB vertraut und habe DB nur als Anwendungsprogrammierer verwendet. Ich möchte etwas über Clustered
und 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?
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:
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.
quelle
XML
,VARCHAR(MAX)
oderVARBINARY(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.In zeilenorientiertem SQL Server-Speicher sind sowohl Clustered- als auch Nonclustered-Indizes als B-Bäume organisiert.
( 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.
Nicht geclusterte Indizes können auch Punkt 1 ausführen, indem sie die
INCLUDE
Klausel (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).Die beiden obigen Indizes sind nahezu identisch. Mit den Indexseiten der oberen Ebene, die Werte für die Schlüsselspalten enthalten,
A,B
und den Seiten auf Blattebene, die Werte enthaltenA,B,C,D
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.
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.
Dann überprüfte das Seitenlayout mit
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.
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
Ich habe folgendes
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
INCLUDE
nichts 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
uniquifier
fü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
quelle
SQL Server 2014
. Ich erhalte95%
nach der ersten Einfügung eine Fragmentierung des Index. Nachindex rebuild
der Fragmentierung wurde0%
und die Werte geordnet. Ich frage mich, können wir das sagenThe only time the data rows in a table are stored in sorted order is when its clustered index fragmentation is 0
?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 F736s
lautet, suchen Sie zunächst die beschriftete Bücherregalreihe001-099
oder ähnliches. (Dieses Endkappenzeichen am Ende des Stapels entspricht einem "Zwischenknoten" im Index.) Schließlich würden Sie einen Drilldown zu dem angegebenen Regal durchführen005.7450 - 005.7600
und 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 - Kl
z. 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.
quelle
Nachfolgend finden Sie einige Merkmale von Clustered- und Nicht-Clustered-Indizes:
Clustered-Indizes
create Index index_name(col1, col2, col.....)
.Nicht gruppierte Indizes
quelle
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.
quelle
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.
quelle
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
quelle
Lassen Sie mich eine Lehrbuchdefinition zum Thema "Clustering-Index" anbieten, die aus 15.6.1 von Database Systems: The Complete Book stammt :
Um die Definition zu verstehen, werfen wir einen Blick auf Beispiel 15.10 aus dem Lehrbuch:
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,
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".
quelle
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.
quelle
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
Weitere Informationen finden Sie in diesem Artikel.
quelle