it-swarm.com.de

Unterschied zwischen gruppiertem und nicht gruppiertem Index

Ich muss meinen Tabellen das richtige index hinzufügen und brauche Hilfe.

Ich bin verwirrt und muss einige Punkte klarstellen:

  • Soll ich den Index für die Spalten non-int Verwenden? Warum Warum nicht

  • Ich habe viel über den Index clustered und non-clustered Gelesen, kann mich aber immer noch nicht entscheiden, wann ich einen über den anderen setzen soll. Ein gutes Beispiel würde mir und vielen anderen Entwicklern helfen.

Ich weiß, dass ich keine Indizes für Spalten oder Tabellen verwenden sollte, die häufig aktualisiert werden. Was sollte ich sonst noch beachten und woher weiß ich, dass alles in Ordnung ist, bevor ich zur Testphase gehe?

126
Pabuc

Sie müssen wirklich zwei Punkte auseinanderhalten:

1) Der Primärschlüssel ist ein logisches Konstrukt - einer der Kandidatenschlüssel, der jede Zeile in Ihrer Tabelle eindeutig und zuverlässig identifiziert. Dies kann wirklich alles sein - ein INT, eine GUID, ein String - wählen Sie, was für Ihr Szenario am sinnvollsten ist.

2) der Clustering-Schlüssel (die Spalte oder Spalten, die den "Clustered-Index" für die Tabelle definieren) - dies ist ein physischer speicherbezogene Sache, und hier ist ein kleiner, stabiler, immer größer werdender Datentyp die beste Wahl - INT oder BIGINT als Standardoption.

Standardmäßig wird der Primärschlüssel einer SQL Server-Tabelle auch als Clustering-Schlüssel verwendet - das muss aber nicht so sein!

Eine Faustregel, die ich anwenden würde, lautet: Jede "reguläre" Tabelle (eine, in der Sie Daten speichern, eine Nachschlagetabelle usw.) sollte einen Clustering-Schlüssel haben. Es hat wirklich keinen Sinn, keinen Clustering-Schlüssel zu haben. Tatsächlich beschleunigt das Vorhandensein eines Clusterschlüssels entgegen allgemeiner Meinung alle gängigen Operationen - sogar das Einfügen und Löschen (da die Tabellenorganisation anders und normalerweise besser ist als bei einer Heap - Tabelle ohne ein Clustering-Schlüssel).

Kimberly Tripp, die Königin der Indizierung hat eine Vielzahl hervorragender Artikel zum Thema, warum ein Clustering-Schlüssel benötigt wird und welche Art von Spalten am besten als Clustering-Schlüssel verwendet werden können. Da Sie nur einen pro Tabelle erhalten, ist es äußerst wichtig, den richtigen Clustering-Schlüssel auszuwählen - und nicht nur einen beliebigen Clustering-Schlüssel.

Marc

82
marc_s

Ein Clustered-Index ändert die Art und Weise, in der die Zeilen gespeichert werden. Wenn Sie einen Clustered-Index für eine Spalte (oder mehrere Spalten) erstellen, sortiert SQL Server die Tabellenzeilen nach diesen Spalten. Es ist wie bei einem Wörterbuch, bei dem alle Wörter im gesamten Buch in alphabetischer Reihenfolge sortiert sind.

Ein nicht gruppierter Index ändert dagegen nicht die Art und Weise, wie die Zeilen in der Tabelle gespeichert werden. Es wird ein völlig anderes Objekt in der Tabelle erstellt, das die für die Indizierung ausgewählten Spalten und einen Zeiger zurück zu den Tabellenzeilen mit den Daten enthält. Es ist wie ein Index auf den letzten Seiten eines Buches, in dem Stichwörter sortiert sind und die Seitenzahl zum schnelleren Nachschlagen des Materials des Buches enthalten.

272
riandp

Sie sollten Indizes verwenden, um die Leistung von SQL Server zu verbessern. Normalerweise impliziert dies, dass Spalten, die zum Suchen von Zeilen in einer Tabelle verwendet werden, indiziert werden.

Bei gruppierten Indizes ordnet SQL Server die Zeilen auf dem Datenträger in der angegebenen Reihenfolge an. Dies bedeutet, dass beim Zugriff auf Daten in der Reihenfolge eines Clustered-Index die Daten in der richtigen Reihenfolge auf der Festplatte vorhanden sind. Wenn jedoch die Spalten mit einem Clustered-Index häufig geändert werden, werden die Zeilen auf der Festplatte verschoben, was zu einem Overhead führt - was im Allgemeinen keine gute Idee ist.

Viele Indizes zu haben, ist auch nicht gut. Der Unterhalt kostet. Beginnen Sie also mit den offensichtlichen und stellen Sie dann fest, welche Sie verpassen und von welchen Sie profitieren würden. Sie brauchen sie nicht von Anfang an, sie können später hinzugefügt werden.

Die meisten Spaltendatentypen können beim Indizieren verwendet werden. Es ist jedoch besser, kleine Spalten als große zu indizieren. Es ist auch üblich, Indizes für Spaltengruppen zu erstellen (z. B. Land + Stadt + Straße).

Außerdem werden Sie Leistungsprobleme erst bemerken, wenn Sie eine ganze Menge Daten in Ihren Tabellen haben. Und eine andere Sache, über die man nachdenken sollte, ist, dass SQL Server Statistiken benötigt, um seine Abfrageoptimierungen richtig durchzuführen. Stellen Sie also sicher, dass Sie diese generieren.

26
Anders Zommarin

Ein Vergleich eines nicht gruppierten Index mit einem gruppierten Index mit einem Beispiel

Nehmen wir als Beispiel für einen nicht gruppierten Index an, dass die Spalte "EmployeeID" einen nicht gruppierten Index enthält. In einem nicht gruppierten Index werden beide Werte von gespeichert

Angestellten ID

UND ein Zeiger auf die Zeile in der Employee-Tabelle, in der dieser Wert tatsächlich gespeichert ist. Ein Clustered-Index speichert jedoch tatsächlich die Zeilendaten für eine bestimmte EmployeeID. Wenn Sie also eine Abfrage ausführen, die nach einer EmployeeID von 15 sucht, werden die Daten aus anderen Spalten in der Tabelle angezeigt

EmployeeName, EmployeeAddress usw

. werden alle tatsächlich im Blattknoten des Clustered-Index selbst gespeichert.

Dies bedeutet, dass bei einem nicht gruppierten Index zusätzliche Arbeit erforderlich ist, um diesem Zeiger auf die Zeile in der Tabelle zu folgen und andere gewünschte Werte abzurufen, im Gegensatz zu einem gruppierten Index, der direkt auf die Zeile zugreifen kann, da sie in der Tabelle gespeichert wird Gleiche Reihenfolge wie der Clustered-Index. Daher ist das Lesen aus einem Clustered-Index im Allgemeinen schneller als das Lesen aus einem Nicht-Clustered-Index.

20
ErickBest

Verwenden Sie im Allgemeinen einen Index für eine Spalte, die (häufig) zum Durchsuchen der Tabelle verwendet werden soll, z. B. einen Primärschlüssel (der standardmäßig einen Clustered-Index hat). Zum Beispiel, wenn Sie die Abfrage haben (im Pseudocode)

SELECT * FROM FOO WHERE FOO.BAR = 2

Möglicherweise möchten Sie einen Index für FOO.BAR erstellen. Ein Clustered-Index sollte für eine Spalte verwendet werden, die zum Sortieren verwendet wird. Ein Clustered-Index wird verwendet, um die Zeilen auf der Festplatte zu sortieren, sodass Sie nur eine pro Tabelle haben können. Zum Beispiel, wenn Sie die Abfrage haben

SELECT * FROM FOO ORDER BY FOO.BAR ASCENDING

Möglicherweise möchten Sie einen Clustered-Index für FOO.BAR in Betracht ziehen.

Die wahrscheinlich wichtigste Überlegung ist, wie viel Zeit Ihre Abfragen in Anspruch nehmen. Wenn eine Abfrage nicht viel Zeit in Anspruch nimmt oder nicht häufig verwendet wird, lohnt es sich möglicherweise nicht, Indizes hinzuzufügen. Wie immer erst profilieren, dann optimieren. SQL Server Studio kann Ihnen Vorschläge zur Optimierung geben, und MSDN verfügt über einige Informationen 1 , die Sie möglicherweise nützlich finden

4
Brandon Bohrer

schneller zu lesen als bei Nicht-Clustern, da die Daten physisch in der Indexreihenfolge sortiert sind. Wir können nur eine pro Tabelle erstellen. (Cluster-Index)

schneller zum Einfügen und Aktualisieren als ein Cluster-Index. Wir können n Nummern von Nicht-Cluster-Indizes erstellen.

2
kanika dubey