Clustered vs Non-Clustered Tables

7

Es kam vor, dass ich eine ganze Weile mit SQL Server und Oracle arbeiten musste (zum Glück nicht gleichzeitig).

Was mich immer noch verwundert, ist der Ansatz, Tische als ausgewogene Bäume zu speichern. In Oracle-ähnlichen RDMS-Heaps ist Standard, in SQL Server (und vielen anderen) ist das Gegenteil (Clustered, IOT) der Fall. Adepten jedes Ansatzes behaupten, ihr Weg sei der einzige "richtige" und unterstützen gewählte Standpunkt mit einer Reihe von Tests / Präsentationen. Meiner Meinung nach ist der einzige Punkt, den sie bewiesen haben, dass die Implementierung des "Nicht-Standard" -Ansatzes schlecht ist und in den meisten Fällen nicht verwendet werden sollte ...

Ich bin mir ziemlich sicher, dass beide Ansätze gut genug sind (nur weil sie noch auf dem Markt sind und eine vergleichbare Leistung zeigen) und etwas Mathematik darunter haben, aber ich habe keine guten Referenzen gefunden.

Mir ist klar, dass das Thema möglicherweise zu weit gefasst ist, um es zu beantworten, und gute Links sind sehr willkommen, aber ich möchte wirklich wissen, warum zwei scheinbar kontroverse Ansätze bewiesen haben, dass beide gültig sind.

a1ex07
quelle

Antworten:

5

Ich war in der gleichen Position, als ich meine Karriere als SQL Server DBA begann, studierte aber hauptsächlich ORACLE (10 g) an meiner Universität. Und das OCA-Zeug auch ...

Ich stimme @KennethFisher zu, dass beide RDBMS unterschiedlich sind und der Vergleich wie der Vergleich von Äpfeln und Orangen ist.

Um Ihre Frage zu beantworten: Speichern von Tischen als ausgewogene Bäume ...

  • Sowohl Oracle als auch SQL Server unterstützen B-Tree- Indizes, die die Daten sortieren und Suchen, sequentiellen Zugriff, Einfügen und Löschen in logarithmischer Zeit ermöglichen.
  • B-Tree ist gut für Systeme optimiert, die große Datenblöcke lesen und schreiben. Beachten Sie, dass SQL Server diese Struktur für nicht gruppierte Indizes verwendet und Oracle sie standardmäßig verwendet, um den Speicherort der Tabelle intern zu speichern.
  • Oracle hat ein Konzept von ROWID (Zeilen-ID) und UROWID (universelle Zeilen-ID), bei dem in den Schlüsselwerten ein eindeutiger Verweis auf den Speicherort des Datensatzes enthalten ist, der den physischen Speicherort auf der Festplatte darstellt, auf dem der Datensatz gespeichert ist.

zB Referenzübersicht über ROWID- und UROWID-Datentypen

SELECT ROWID, last_name FROM employees WHERE department_id = 20; 

ROWID              LAST_NAME 
------------------ ---------- 
AAAAaoAATAAABrXAAA BORTINS 
AAAAaoAATAAABrXAAE RUGGLES 
AAAAaoAATAAABrXAAG CHEN 
AAAAaoAATAAABrXAAN BLUMBERG 

Eine erweiterte Zeilen-ID hat das vierteilige Format OOOOOOFFFBBBBBBRRR:

OOOOOO: Die Datenobjektnummer, die das Datenbanksegment identifiziert (im Beispiel AAAAao). Schemaobjekte im selben Segment, z. B. ein Tabellencluster, haben dieselbe Datenobjektnummer.

FFF: Die tablespace-relative Datendateinummer der Datendatei, die die Zeile enthält (Datei AAT im Beispiel).

BBBBBB: Der Datenblock, der die Zeile enthält (Block AAABrX im Beispiel). Blocknummern beziehen sich auf ihre Datendatei und nicht auf den Tabellenbereich. Daher können sich zwei Zeilen mit identischen Blocknummern in zwei verschiedenen Datendateien desselben Tabellenbereichs befinden.

RRR: Die Zeile im Block.

  • Daher sind die Konzepte sowohl in RDBMS - ORACLE als auch in SQL Server völlig unterschiedlich. Außerdem sind in Oracle erstellte PKs nichts anderes als ausgeglichene nicht gruppierte Indizes mit ROWID für den schnellen Zugriff und daher kein Konzept für gruppierte oder nicht gruppierte Indizes.

Jetzt wird dies interessanter und anders, wenn es um B + Tree- Indizes geht:

  • B + Tree-Strukturen ähneln B-Tree-Strukturen, aber die Tabellendatensätze (tatsächliche Daten) werden in den Blattknoten des Primärschlüsselindex gespeichert und ermöglichen einen schnellen Zugriff für exakte Übereinstimmungs- oder Bereichssuchsuchen in der PK der Tabelle.

  • Oracle verwendet sogenannte IOT (Index Organized Tables) und SQL Server verwendet sogenannte Clustered Indexes.

Schauen wir uns Clustered Indizes und Index Organized Tables (IOT) an ...:

Von Oracle Doc ,

Eine indexorganisierte Tabelle ist eine Tabelle, die in einer Variation einer B-Baum-Indexstruktur gespeichert ist. In einer Heap-organisierten Tabelle werden Zeilen dort eingefügt, wo sie passen. In einer indexorganisierten Tabelle werden Zeilen in einem Index gespeichert, der auf dem Primärschlüssel für die Tabelle definiert ist. Jeder Indexeintrag im B-Baum speichert auch die Nichtschlüsselspaltenwerte. Somit ist der Index die Daten und die Daten sind der Index. Anwendungen bearbeiten indexorganisierte Tabellen genau wie Heap-organisierte Tabellen mithilfe von SQL-Anweisungen.

Geben Sie hier die Bildbeschreibung ein

Aus SQL Server Doc ,

In SQL Server sind Indizes als B-Bäume organisiert. Jede Seite in einem Index-B-Baum wird als Indexknoten bezeichnet. Der oberste Knoten des B-Baums wird als Wurzelknoten bezeichnet. Die unterste Ebene der Knoten im Index wird als Blattknoten bezeichnet. Alle Indexebenen zwischen der Wurzel und den Blattknoten werden zusammen als Zwischenebenen bezeichnet. In einem Clustered-Index enthalten die Blattknoten die Datenseiten der zugrunde liegenden Tabelle. Die Knoten der Stamm- und Zwischenebene enthalten Indexseiten mit Indexzeilen. Jede Indexzeile enthält einen Schlüsselwert und einen Zeiger auf eine Zwischenebene im B-Baum oder eine Datenzeile auf der Blattebene des Index. Die Seiten in jeder Ebene des Index sind in einer doppelt verknüpften Liste verknüpft.

Geben Sie hier die Bildbeschreibung ein

  • Statistiken für IOTs enthalten die physische Streuung von Zeilen, während SQL Server die physische Position der Zeilen in Statistiken nicht berücksichtigt. Daher ist der Clustered Index in SQL Server besser als ein HEAP - Daten werden nach dem Clustered Key sortiert und gute Schätzungen für die Daten erhalten gesucht werden.

Endlich ein paar gute Referenzen:

Ich werde weitere Punkte hinzufügen, die erwähnenswert sind ...

Kin Shah
quelle
Vielen Dank für die Antwort und die tollen Referenzen. Ich würde Ihrer Metapher in Bezug auf "Äpfel und Orangen" jedoch nicht zustimmen.
a1ex07
@ a1ex07 Schön, dass es helfen konnte. Die Metapher für 'Äpfel und Orangen' war speziell dafür gedacht, wie 2 verschiedene RDBMS die Daten sowie verschiedene für sie verfügbare Indexoptionen speichern.
Kin Shah
3

Eigentlich gibt es eine ziemlich einfache Antwort. Oracle und ähnliche RDBMS sind für die Verwendung von Heaps optimiert, während MS SQL Server und ähnliche für die Verwendung von Clustered-Indizes optimiert sind. Wenn Sie sich die Interna jedes Systems ansehen, werden Sie feststellen, dass ihr Design für die gewählte Methode ausgelegt ist. In diesem speziellen Fall sind also beide Gruppen von "Adepten" korrekt. In SQL Server funktionieren Tabellen mit Clustered-Indizes besser, in Oracle-Heaps besser (im Allgemeinen in beiden Fällen). Ich bin mir nicht sicher, ob einer der Ansätze im Allgemeinen besser oder schlechter ist. Es ist nur eine Frage der Präferenz der RDBMS-Designer. Und basierend auf dem, was ich über die Interna von MS SQL Server gesehen habe (ich habe die Interna von Oracle noch nicht studiert), bin ich mir nicht sicher, ob Sie ein RDBMS schreiben können, das in beide Richtungen gut funktioniert.

Kenneth Fisher
quelle
Vielen Dank für Ihre Zeit beim Schreiben der Antwort (+1). Aber ich möchte wirklich etwas Spezifischeres sehen als "nur optimiert, um Clustered-Indizes zu verwenden / nicht zu verwenden".
Trotzdem
Ja, leider bin ich gerade erst tief genug in MS SQL Server eingetreten, um mir der Unterschiede bewusst zu werden, und ich weiß so gut wie nichts über Oracle, sodass ich an dieser Stelle nur allgemein sprechen kann.
Kenneth Fisher