2012-04-15 12 views
5

Ich habe einen Oracle-Hintergrund, und die Verwendung von "Indexed organisierte Tabellen" (IOT) für jede Tabelle klingt in Oracle unangemessen und ich habe das nie wirklich gesehen. In SQL Server hat jede Datenbank, an der ich gearbeitet habe, einen gruppierten Index für jede Tabelle, der mit IOT (konzeptionell) identisch ist.Clustered-Indizes SQL Server

Warum ist das? Gibt es einen Grund, den Clustered Index überall zu verwenden? Scheint mir, als wären sie nur für eine Handvoll Fälle gut.

Dank

+4

Hier ist eine verwandte Frage zu [DBA-SE] (http://dba.stackexchange.com/) mit einigen Informationen und ein paar Links, wo Sie weiterlesen können. [Leistung von nicht geclusterten Indizes auf Haufen im Vergleich zu geclusterten Indizes] (http://dba.stackexchange.com/questions/9829/performance-of-non-clustered-indexes-on-heaps-vs-clustered-indexes) –

+4

Wahrscheinlich a Frage am besten von jemandem beantwortet, der mit Oracle und SQL Server vertraut ist. [dba.se] könnte ein besserer Ort dafür sein. –

+1

Sie sollten diese Frage auch an dba.se senden. Es hatte zwei Kommentare und eine (rein zufällige) Antwort von DBA.SE-Stammgästen, ohne dass eines der anderen Poster tatsächlich annahm, dass gruppierte Indizes und IOTs tatsächlich signifikante Unterschiede aufweisen. – ConcernedOfTunbridgeWells

Antwort

2

Ohne einen gruppierten Index ist Ihre Tabelle als Heap organisiert. Dies bedeutet, dass jede Zeile, die eingefügt wird, auf der Datenseite am Ende der Tabelle hinzugefügt wird. Wenn Zeilen aktualisiert werden, werden sie auch auf die Datenseite am Ende der Tabelle verschoben, wenn die aktualisierten Daten größer als vorher sind.

Wenn es gut ist, nicht ein Clustered-Index

haben, wenn Sie eine Tabelle, die die schnellstmögliche Einsätze benötigt, kann aber Update opfern und Geschwindigkeit lesen, dann nicht einen Clustered-Index hat, kann für Arbeit Sie. Ein Beispiel wäre, wenn Sie eine Tabelle hätten, die als Warteschlange verwendet wird, zum Beispiel viele Einfügungen, die später einfach gelesen und in eine andere Tabelle verschoben werden.

Clustered-Indizes

Clustered-Indizes, die Daten in der Tabelle auf der Basis der Spalten in dem gruppierten Index organisieren. Wenn Sie zum Beispiel eine falsche ID cluntern, kann dies die Dinge verlangsamen (siehe unten).

Solange Ihr Clustered-Index den Wert aufweist, der am häufigsten für die Suche verwendet wird, und er ist eindeutig und erhöht, erhalten Sie einige erstaunliche Leistungsvorteile aus dem Clustered-Index.Wenn Sie beispielsweise eine Tabelle namens USERS haben, in der Sie üblicherweise Benutzerdaten auf der Basis von USER_ID nachschlagen, würde das Clustering auf USER_ID die Leistung all dieser Suchvorgänge beschleunigen. Dies reduziert einfach die Anzahl der Datenseiten, die gelesen werden müssen, um an Ihre Daten zu gelangen.

Wenn Sie zu viele Schlüssel in Ihrem Clustered-Index haben, kann dies auch die Dinge verlangsamen.

Allgemeine Regeln für Clustered-Indizes:

auf alle Varchar Spalten Cluster nicht.

Clustering auf INT IDENTITY-Spalten ist in der Regel am besten.

Cluster auf was Sie allgemein suchen.

Clustering auf UniqueIdentifiers

Mit uniqueidentifiers in einem Index sind sie extrem ineffizient, weil es keine natürliche Sortierreihenfolge ist. Basierend auf der B-Baum-Struktur des Indexes erhalten Sie extrem fragmentierte Indizes, wenn Sie Uniqueidentifiers verwenden. Nach dem Wiederaufbau oder der Umstrukturierung sind sie immer noch extrem fragmentiert. Sie haben also einen langsameren Index, der aufgrund der Fragmentierung im Speicher und auf der Festplatte sehr groß ist. Auch bei Einfügungen des Uniqueidentifiers ist es wahrscheinlicher, dass Sie mit einer Seitenaufteilung auf dem Index enden, wodurch Ihre Einfügung verlangsamt wird. Im Allgemeinen sind Uniqueidentifiers schlechte Nachrichten für Indizes.

Zusammenfassung

Meine Empfehlung ist, dass jeder Tisch auf sie einen Clustered-Index haben sollte, es sei denn, ein wirklich guter Grund, es nicht zu (dh Tabelle als eine Warteschlange funktioniert).

+0

Dies bestätigt mein Verständnis von Clustered-Indizes. Ich kann verstehen, Indizes auf Nachschlagetabellen mit einer endlichen Anzahl von Zeilen zu haben. Passt die Rechnung. Und im Grunde genommen Heap für Faktentabellen, die weiter wachsen und die beim Einfügen natürlich geordnet werden. Derjenige, der mich die ganze Zeit verwirrt hat, ist der, den Sie beschreiben, indem ich "Clustering auf UniqueIdentifiers" beschreibe. Ich habe eine Datenbank geerbt, in der eine Datenbank auf einer 2B-Tabelle wächst. Es hat nie Sinn für mich gemacht! Darüber hinaus hatte es einen automatisierten Job, um es neu zu erstellen. Danke, viele Dinge fangen jetzt an. – Younes

0

Wir Primärschlüssel in relationalen Datenbanken und im allgemeinen Beziehung verwenden wird über diesen Primärschlüssel festgelegt. Die meisten Leute nannten das erste Feld als TableID und machten es zum Primärschlüssel. Wenn Sie zwei oder mehr Tabellen in Ihrer Abfrage verknüpfen, erhalten Sie das schnellste Ergebnis, wenn Sie gruppierte Indizes verwenden.

1

Ich würde nicht wissen, warum Sie die meiste Zeit einen Heap über einen gruppierten Index bevorzugen würden. Mit Clustering erhalten Sie einen Index Ihrer Wahl kostenlos. Meistens ist dies der Primärschlüssel (den Sie wahrscheinlich sowieso durchsetzen wollen!).

Heaps sind meistens für spezielle Situationen.

6

Ein Clustered-Index ist nicht ganz dasselbe wie eine indexorganisierte Tabelle. Bei einem IOT muss jedes Feld am IOT-Schlüssel teilnehmen. Ein gruppierter Index in SQL Server muss nicht eindeutig sein und muss nicht der Primärschlüssel sein.

Clustered-Indizes werden häufig in SQL Server verwendet, da es fast immer eine natürliche Reihenfolge gibt, die eine häufig verwendete Abfrage effizienter macht. IOTs in Oracle tragen mehr Gepäck, also sind sie nicht ganz so nützlich, obwohl sie vielleicht nützlicher sind, als sie üblicherweise anerkannt werden.

In der Vergangenheit unterstützten wirklich alte Versionen von SQL Server Pre 6.5 oder 7.0 IIRC nicht das Sperren auf Zeilenebene und konnten nur auf Tabellen- oder Seitenebene sperren. Häufig wird ein gruppierter Index verwendet, um sicherzustellen, dass Schreibvorgänge um den physischen Speicher der Tabelle verstreut sind, um Konflikte bei Seitensperren zu minimieren. SQL Server 6 wurde jedoch vor einigen Jahren unterstützt, sodass Anwendungen mit diesem Problem auf seltene Legacy-Systeme beschränkt sind.

+0

Im Allgemeinen stört mich Clustered-Indizes auf Dimensionstabelle (kleine Tabellen). In der Tat Tabellen, aber ich bin mir nicht sicher, ob es eine gute Idee ist, verlangsamt das Laden und das vollständige Scannen. Und in fast allen Fällen ist die natürliche Reihenfolge zeitbasiert, im Allgemeinen die Reihenfolge, in der die Daten geladen wurden. – Younes

+1

@ Younes - Clustered-Indizes werden in einer Faktentabelle nicht wirklich verwendet, da die meisten Abfragen einen Tabellenscan beinhalten. Möglicherweise möchten Sie bei einer Version, die keine Partitionierung unterstützt (z. B. 2012 B. I. Edition), einen Clustered-Index für die Datums- oder Periodenspalte verwenden, um die E/A bei Lade- oder Archivierungsoperationen zu minimieren. Abfragen mit Datumsbereichen können möglicherweise auch den Clustered-Index verwenden, um E/A durch Verwendung von Bereichsscanvorgängen zu reduzieren. – ConcernedOfTunbridgeWells

Verwandte Themen