Was ist ein Clustered Index?

15

Ich brauche eine kurze Erklärung des Clustered Index.

  • Was ist ein Clustered-Index?
  • Was sind bewährte Methoden für die Verwendung des Clustered-Index?
Amir Rezaei
quelle
Es ist eine gute Idee, Daten in einem Clustered-Index zu verwenden, da neue Daten immer an das Ende der Tabelle angehängt werden.
Ralph Winters
1
Möglicherweise, aber nicht immer.
Mrdenny
@mrdenny - könntest du näher darauf eingehen, wann dies nicht so wäre?
Ralph Winters
1
Wenn Zeilen in falscher Reihenfolge eingegeben werden. Wenn die Tabelle in der Regel vom Primärschlüssel abgefragt wird. Wenn der Primärschlüssel ein INT (oder kleiner) ist und die Tabelle viele nicht gruppierte Indizes enthält, ist ein datetime-Clusterschlüssel größer und weniger effizient. Wenn die Tabelle nie von der Datumsspalte abgefragt wird, lohnt sich die Verwendung von is als Clustering-Schlüssel nicht, da nur die nicht geclusterten Indizes verwendet werden.
Mrdenny
@ Mrdenny: auch wenn die Tabelle keine Datumsspalte hat (eine Teilmenge von Ihrem letzten :)
ypercubeᵀᴹ

Antworten:

15

In einfachen Worten...

Ein Telefonverzeichnis: Die Daten sind der Index / der Index sind die Daten. Um dich aufzusuchen, würde ich zum Beispiel mit Rezaei, Amir beginnen. Es ist keine externe Suche erforderlich.

In Datenbankbegriffen:

Die Tabellendaten und der Clustered-Index sind identisch (in SQL Server auch InnoDB, Oracle IOT)

Die empfohlene Vorgehensweise ist eng, numerisch und nimmt streng zu (siehe Spalte IDENTITY oder Autonumber). Datentypen wie GUIDs sind keine gute Idee

Links zum Lesen (um zu vermeiden, dass diese Antwort aufgebläht wird)

Bearbeiten, um meine Best-Practice-Vorschläge vollständig zu erläutern, folgen Sie dem Link in Eric Humphreys Kommentar: Königin der Indizierung: Kimberly Tripp

gbn
quelle
3
Sie werden auch Kimberly Tripps Blog wollen: sqlskills.com/BLOGS/KIMBERLY/category/Clustered-Index.aspx
Eric Humphrey - lotsahelp
1
Und da liegt das Problem, "Best Practice" ohne Kontext anzuwenden. Wenn beispielsweise das primäre Suchkriterium für eine große, häufig durchsuchte Tabelle ein Datumsbereich ist, ist der beste Speicherort für den Clustered-Index das gesuchte Datum, NICHT der Primärschlüssel. Zu sagen, dass die Tabelle und der Clustered-Index ein und dasselbe sind, ist etwas zu stark vereinfacht. Die Daten werden tatsächlich in der Reihenfolge gespeichert, die vom Clustered-Index vorgegeben wird. Dies bedeutet unter anderem, dass Clustered-Indizes besonders für Bereichssuchen nützlich sind, bei denen der gesamte Datensatz zurückgegeben wird.
Russell Steen
2
@Russell Steen: 1. Ich habe Links eingefügt. 2. OP musste fragen, auf welcher Ebene ich diese Antwort platziert habe. 3. Eric Humphrey hat einen Link zum Erstellen geliefert. Wir können von Fall zu Fall durchgehen, was wir erfahreneren Leute wissen und verstehen, aber sind wir hier, um zu helfen, zu erziehen oder zu überwältigen ...?
26.
Ich höre, was du sagst. Das Problem liegt nicht in Ihrer Antwort an sich, sondern in der Tatsache, dass weniger erfahrene Leute als Sie herumlaufen, um etwas zu zitieren und anzuwenden, weil es sich um "Best Practice" handelt, ohne die Verwendung und den Kontext zu verstehen, für die die Best Practice geschrieben wurde - ich würde argumentieren Sie, dass wir hier sind, um zu unterrichten, und dass das Zitieren von Best Practices ohne die Bereitstellung von mehr Kontext direkt in der Post keine so gute Arbeit leistet.
Russell Steen
2
Oh, habe gerade das SQL-ServerEtikett bemerkt , ignoriere es.
ypercubeᵀᴹ
3

Es ist ein Index für die Daten selbst, sodass die Datensätze physisch nach dem Feld sortiert sind, für das Sie den Clustered-Index haben. Aus diesem Grund können Sie nur einen Clustered-Index pro Tabelle haben.

Non Clustered Index ist nicht so schnell für Suchvorgänge, aber Sie können viele dieser Indextypen in einer Tabelle haben.

kacalapy
quelle
3
Nicht gruppierte Indizes können für Suchvorgänge genauso effizient sein, wenn der nicht gruppierte Index die fragliche Suche abdeckt.
Russell Steen
@Russell Es gibt keine Möglichkeit, schneller zu sein, da der Index die tatsächliche Sortierreihenfolge der Daten erzwungen hat. Es gibt keinen einfacheren / schnelleren Weg für SQL oder RDBMS, die benötigten Informationen zu finden.
Kacalapy
4
Schneller habe ich nicht gesagt. Ein Deckungsindex enthält alle Daten, die in der Auswahl im Index - IN ORDER - angefordert wurden, an einer separaten Stelle auf der Festplatte. Ein Select gegen einen passenden Covering Index trifft also nie auf den Tisch.
Russell Steen
2
Ein überdeckendes NCI wird wahrscheinlich kleiner sein, was bedeutet, dass weniger Seiten gelesen werden müssen und dass es schneller ist.
Martin Smith
Der Grund dafür, dass nur ein Clustered-Index in einer Tabelle vorhanden ist, ist keine physische Sortierung. Indexseiten werden immer logisch sortiert, und die fortlaufende Zuordnung von Seiten ist nicht garantiert. Sie können nur einen Clustered-Index pro Tabelle haben, da der Clustered-Index die Tabelle selbst ist und Nicht-Clustered-Indizes die Kopien der Tabelle mit den erforderlichen Spalten sind.
Manoj Pandey