Wie erstelle ich einen Clustered- und einen Nicht-Clustered-Index in Oracle?


9

Ich habe ein paar Stunden mit meiner Frage verbracht und keine zufriedenstellende Antwort erhalten. Ich habe immer noch Zweifel. Ich habe Folgendes über Clustered Index gefunden:

  1. Die Daten werden in der Reihenfolge des Clustered-Index gespeichert.
  2. Nur ein Clustered-Index pro Tabelle.
  3. Wenn ein Primärschlüssel erstellt wird, wird automatisch auch ein Clusterindex erstellt.

Ich habe diese Punkte bekommen, aber meine Fragen sind:

  1. Ist der Cluster-Index in der Oracle-Datenbank vorhanden, da ich in einigen Blogs gelesen habe: "Oracle hat kein Konzept für einen Cluster-Index."
  2. Wenn ja, teilen Sie mir bitte die SQL-Anweisung mit, um einen Cluster-Index zu erstellen .
  3. Wie oben erwähnt, wird der Clusterindex automatisch erstellt, wenn der Primärschlüssel in einer Spalte einer Tabelle definiert wird. Wie kann ich den Indextyp überprüfen, ob er erstellt wurde oder nicht?

Hier finden Sie meine Tabellenarchitektur:

Geben Sie hier die Bildbeschreibung ein

Lassen Sie mich wissen, ob noch etwas erforderlich ist, um Antworten auf diese Fragen zu erhalten.

Antworten:


17

Ist der Cluster-Index in der Oracle-Datenbank vorhanden, seit ich in einigen Blogs gelesen habe?

Ja da ist.

Es heißt "Index Organized Table" (IOT) - was meiner Meinung nach der bessere Name ist, da es absolut klar macht, dass der Index und die Tabelle dieselbe physische Sache sind (weshalb nur ein Clustered-Index enthalten sein kann) SQL Server)

Wenn ja, teilen Sie mir bitte die SQL-Anweisung zum Erstellen eines Clusterindex mit.

Es gibt kein create clustered indexOracle.

Um eine indexorganisierte Tabelle zu erstellen, verwenden Sie die create tableAnweisung mit der organization indexOption.

In Oracle verwenden Sie normalerweise IOTs für sehr enge Tabellen. Sehr häufig für Tabellen, die nur aus den Primärschlüsselspalten bestehen (z. B. m: n-Zuordnungstabellen), z

create table assignment
(
   person_id  integer not null, 
   job_id     integer not null, 
   primary key (person_id, job_id)
)
organization index;

Sie können IOTs mit mehr Spalten erstellen. In diesem Fall müssen Sie die Nicht-pk-Spalten als "eingeschlossene" Spalten definieren. Beispiel: Wenn die Zuordnungstabelle zusätzliche Spalten wie Start- und Enddatum enthalten soll, die nicht Teil des Primärschlüssels sind:

create table assignment
(
   person_id   integer not null, 
   job_id      integer not null, 
   start_date  date, 
   end_date    date,
   primary key (person_id, job_id)
)
organization index
including start_date
overflow storage (initial 4k);

Weitere Details und Beispiele finden Sie im Handbuch: https://docs.oracle.com/database/121/SQLRF/statements_7002.htm#i2153235


Etwas unabhängig, aber vielleicht trotzdem interessant:

Ein interessanter Blog-Beitrag, der das Verhalten von SQL Server (und MySQL) bei der Verwendung eines Clustered-Index als Standard beim Erstellen einer Tabelle in Frage stellt:

Unangemessene Standardeinstellungen: Primärschlüssel als Clustering-Schlüssel

Ich komme aus Oracle und stimme dem voll und ganz zu.


8

Ich habe Folgendes über Clustered Index gefunden:

  1. Die Daten werden in der Reihenfolge des Clustered-Index gespeichert.
  2. Nur ein Clustered-Index pro Tabelle.
  3. Wenn ein Primärschlüssel erstellt wird, wird automatisch auch ein Clusterindex erstellt.

Du hast ein paar Stunden gegraben. Sie sollten bemerkt haben, dass alle oben genannten Fakten für SQL Server und nicht für Oracle gelten .

Tabellen (zumindest normale) in Oracle haben keinen Clustered-Index. Es gibt eine spezielle Art von Tabellen, die als Index Organized Tables (IOT) bezeichnet werden und ein ähnliches Konzept haben. Details in der Oracle-Dokumentation (9i): Index Organized Tables :

Was sind indexorganisierte Tabellen?

Eine indexorganisierte Tabelle verfügt im Gegensatz zu einer normalen Tabelle über eine eigene Methode zum Strukturieren, Speichern und Indizieren von Daten. Ein Vergleich mit einer gewöhnlichen Tabelle kann helfen, ihre Einzigartigkeit zu erklären.

Indexorganisierte Tabellen versus gewöhnliche Tabellen

Eine Zeile in einer normalen Tabelle hat einen stabilen physischen Standort. Sobald dieser Ort festgelegt ist, wird die Zeile nie mehr vollständig verschoben. Selbst wenn es teilweise durch Hinzufügen neuer Daten verschoben wird, befindet sich immer ein Zeilenstück an der ursprünglichen physischen Adresse - identifiziert durch die ursprüngliche physische Zeilen-ID -, anhand dessen das System den Rest der Zeile finden kann. Solange die Zeile vorhanden ist, ändert sich ihre physische Zeilen-ID nicht. Ein Index in einer normalen Tabelle speichert sowohl die Spaltendaten als auch die Zeilen-ID.

Eine Zeile in einer indexorganisierten Tabelle hat keinen stabilen physischen Speicherort. Es hält die Daten in sortierter Reihenfolge in den Blättern eines B * -Baumindex, der auf dem Primärschlüssel der Tabelle basiert. Diese Zeilen können verschoben werden, um die sortierte Reihenfolge beizubehalten. Beispielsweise kann eine Einfügung dazu führen, dass eine vorhandene Zeile in einen anderen Steckplatz oder sogar in einen anderen Block verschoben wird.

Die Blätter des B * -Baumindex enthalten den Primärschlüssel und die tatsächlichen Zeilendaten. Änderungen an den Tabellendaten - beispielsweise das Hinzufügen neuer Zeilen oder das Aktualisieren oder Löschen vorhandener Zeilen - führen nur zur Aktualisierung des Index.

Siehe auch die Dokumentation zu (11g): Index Organized Tables in der neueren Oracle 11g-Version.


@a_horse_with_no_name Ich war mir nicht sicher, ob es genau das gleiche ist. In der Dokumentation stelle ich einen kleinen Unterschied in Bezug auf Sekundärindizes fest: "Die logische Zeilen-ID in der ROWID-Pseudospalte ermöglicht das Erstellen von Sekundärindizes." In SQL Server werden dafür die PK-Spalten verwendet, keine ROWID.
Ypercubeᵀᴹ

-2

Derzeit gibt es keine Möglichkeit, einen Clustered-Index zu erstellen. Es können jedoch einige Funktionen hinzugefügt werden, um nahezu das gleiche Ergebnis zu erzielen: (B-Tree & Bitmap INDX) 1. SCHRITT - Cluster für eine oder mehrere Tabellen erstellen - Referenz, z. B. PK - gemeinsame Spalte 2. SCHRITT - einige Tabellen zum Cluster hinzufügen 3. SCHRITT - CLUSTERED INDEX innerhalb eines CLUSTER erstellen - siehe letzte SQL-Datei (INDEX_TYPE = CLUSTERED CLUSTERING_FACTOR = 1)

Geben Sie hier die Bildbeschreibung ein


-6

CREATE CLUSTER employee_departments_cluster (department_id NUMBER (4)) GRÖSSE 512;

CREATE TABLE Mitarbeiter (Abteilungs-ID-Nummer (4), Name varchar2 (10), empno int) CLUSTER employee_departments_cluster (Abteilungs-ID);

CREATE TABLE Abteilungen (Abteilung_ID-Nummer (4), dname varchar2 (10), sales int) CLUSTER employee_departments_cluster (Abteilung_id);

CREATE INDEX idx_emp_dept_cluster ON CLUSTER employee_departments_cluster; Werte in Abteilungen einfügen (1, 'd1', 1000); Werte in Mitarbeiter einfügen (1, 'emp123', 123); Werte in Mitarbeiter einfügen (1, 'emp124', 124); Werte in Mitarbeiter einfügen (1, 'emp125', 125);

Wählen Sie INDEX_NAME, INDEX_TYPE, TABLE_NAME, TABLE_TYPE, CLUSTERING_FACTOR aus DBA_INDEXES aus. WHERE INDEX_NAME = UPPER ('idx_emp_dept_cluster');

INDEX_NAME, INDEX_TYPE, TABLE_NAME, TABLE_TYPE, CLUSTERING_FACTOR IDX_EMP_DEPT_CLUSTER, CLUSTER, EMPLOYEES_DEPARTMENTS_CLUSTER, CLUSTER, 1


3
Für zukünftige Leser wäre es nützlicher, wenn Sie eine Erklärung hinzufügen würden, wie diese Aussagen die ursprüngliche Frage beantworten.
Mustaccio

1
Dies trägt nicht zu dem bei, was die vorhandenen Antworten gesagt haben.
Michael Green
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.