Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Partitionierte Oracle-Tabelle

Was ist eine Oracle-partitionierte Tabelle?

Beim Partitionieren wird eine Tabelle, ein Index oder eine indexorganisierte Tabelle in kleinere Komponenten unterteilt. Jede Komponente wird als Partition (oder Unterpartition für zusammengesetzte partitionierte Objekte) bezeichnet. Jede Partition hat einen eindeutigen Namen und kann optional individuelle Speichereigenschaften haben:Beispiele sind Komprimierung oder Speicherung in verschiedenen Tablespaces. Eine gut durchdachte Partitionierungsstrategie kann den Abfragezugriff und Aktualisierungen verbessern, indem der Vorgang auf eine einzelne Partition oder eine Teilmenge von Partitionen beschränkt wird.

Partitionierung für Leistung – Partitionsbereinigung

Die Oracle-Funktion für partitionierte Tabellen ermöglicht es dem Abfrageoptimierer, Partitionen zu überspringen, die von einer bestimmten SQL-Anweisung nicht benötigt werden. Abhängig von der SQL-Anweisung kann der Optimierer Partitionen und Unterpartitionen identifizieren, auf die zugegriffen werden muss, sowie solche, auf die dies nicht erforderlich ist. Dies kann zu erheblichen Verbesserungen der Abfrageleistung führen, da sich der Optimierer auf eine bestimmte Teilmenge von Daten konzentriert, die weiter verfeinert werden kann, wenn zusätzliche Prädikate vorhanden sind.

Der Optimierer tut dies, indem er die Partitionsinformationen verwendet, die in gespeichert sind Data Dictionary, um den Inhalt einer Partition zu identifizieren, ohne die darin enthaltenen Daten abzufragen. Die Partitionierung ist eine zusätzliche Ebene des Datenwörterbuchs zwischen Tabellen/Indizes und Tabellenbereichen

Einschränkung der partitionierten Tabelle

In Oracle Database 11g kann eine Tabelle maximal 1048575 (1024 KB – 1) Partitionen haben. Mit der einzigen Ausnahme von Tabellen, die Spalten vom Datentyp LONG oder LONG RAW enthalten, können alle Tabellen partitioniert werden (einschließlich Spalten vom Typ CLOB oder BLOB).

Art der Tabellenpartitionen

Partitionierung ist in der Oracle-Datenbank ab Version 8.0 verfügbar und Oracle fügt mit jeder Version kontinuierlich mehr und mehr Funktionen hinzu. Die folgende Tabelle zeigt eine Zusammenfassung der wichtigsten Änderungen

Die Hauptpartitionsstrategie von Oracle ist
(1)Range
(2)List
(3) Hash
(4)Composite

So erstellen Sie die Partitionstabelle

Je nach Art der Partition können Sie die Partitionstabelle wie folgt erstellen

Bereichspartitionierung

Oracle partitioniert die Daten basierend auf aufeinanderfolgenden Wertebereichen des Partitionsschlüssels.
Der Endpunkt jeder Partition wird mit der folgenden Syntax angegeben:

VALUES LESS THAN (value-list)

Beispiel

CREATE TABLE EXP_RANGE
 (ID NUMBER(15) NOT NULL,
 CODE_ID NUMBER(15) NOT NULL,
 PERIOD_NAME VARCHAR2(15) NOT NULL,
 ACTUAL_FLAG VARCHAR2(1) NOT NULL,
 VERSION_ID NUMBER(15),
 LAST_UPDATE_DATE DATE NOT NULL,
 . . . . . .
 )
 PARTITION BY RANGE (PERIOD_NAME)
 (
 PARTITION PR1 VALUES LESS THAN ('JAN-2019'),
 PARTITION PR2 VALUES LESS THAN ('FEB-2019')
 . . .
 . . .
 );

Bereichspartitionierung ist nützlich für die Partitionierung historischer Daten und Transaktionsdaten, da die Grenzen der Bereichspartitionierung die Reihenfolge der Partitionierung in Tabellen und Indizes definieren

Listenpartitionierung

Bei dieser Methode ordnet Oracle basierend auf einer statischen Liste von Literalwerten bestimmte Zeilen Partitionen zu. Der Partitionsschlüssel für die Listenpartitionierung kann nur auf einer einzigen Spalte basieren.

CREATE TABLE EXP_LIST
 (ID NUMBER NOT NULL,
 ORG_ID NUMBER,
 OPEN_FLAG VARCHAR2(4) NOT NULL,
 . . . . . .
 ) PARTITION BY LIST (open_flag)
 (
 PARTITION PR1 VALUES ('YES'),
 PARTITION PR2 VALUES ('NO')
 );

Hash-Partitionierung

In diesem Orakel wurde der Hash-Algorithmus verwendet, um über die physische Platzierung von Daten zu entscheiden. Die Hash-Partitionierung verteilt Daten gleichmäßig auf eine feste Anzahl von Partitionen.

CREATE TABLE EXP_HASH
 (ID NUMBER NOT NULL,
 ORG_ID NUMBER,
 ORDERED_ITEM VARCHAR2(2000),
 OPEN_FLAG VARCHAR2(1) NOT NULL,
 . . . . . .
 )
 PARTITION BY HASH (ID)
 PARTITIONS 10
 . . .
 . . .;
 );

Zusammengesetzte Partitionierung

In diesem Orakel wird die Kombination aus Range-, List- und Hash-Partitionierung verwendet. Zusammengesetzte Partitionierungsmethoden sind Range-Hash oder Range-List.

CREATE TABLE sales_details
   ( prod_id       NUMBER(6)
   , cust_id       NUMBER
   , time_id       DATE
   , channel_id    VARCHAR2(1)
   , promo_id      NUMBER(6)
   , quantity_sold NUMBER(3)
   , amount_sold   NUMBER(10,2)
   )
  PARTITION BY RANGE (time_id) SUBPARTITION BY HASH (cust_id)
   SUBPARTITIONS 8 STORE IN (ts1, ts2, ts3, ts4)
  ( PARTITION sales_q1_2019 VALUES LESS THAN (TO_DATE('01-APR-2019','dd-MON-yyyy'))
  , PARTITION sales_q2_2019 VALUES LESS THAN (TO_DATE('01-JUL-2019','dd-MON-yyyy'))
  , PARTITION sales_q3_2019 VALUES LESS THAN (TO_DATE('01-OCT-2019','dd-MON-yyyy'))
  , PARTITION sales_q4_2019 VALUES LESS THAN (TO_DATE('01-JAN-2019','dd-MON-yyyy'))
  );

So verschieben Sie das vorhandene Objekt in ein partitioniertes Objekt

Es gibt viele Möglichkeiten, dieses Kunststück zu erreichen. Ich erkläre hier die vereinfachte Methode
1. Erstellen Sie eine leere partitionierte Tabelle mit der partitionierten Klausel und der Option parallel. Der Tabellenname muss einen anderen Namen haben als die nicht partitionierte Tabelle.
2. Füllen Sie Daten für die erforderliche Partition aus der nicht partitionierten Tabelle.
3. Erwägen Sie die Verwendung des Orakelhinweises APPEND mit einer INSERT-Anweisung als einfache Codeänderung, die eine gute Leistung bietet. Wenn die Protokollierung aktiviert ist und Indizes vorhanden sind, ist der Hinweis INSERT /*+ APPEND */ möglicherweise nicht wirksam. Um den Overhead der Indexwartung zu minimieren, löschen Sie Indizes vor der Migration und erstellen Sie sie neu, sobald die partitionierte Tabelle gefüllt wurde.
4. Benennen Sie die partitionierte Tabelle genauso um wie die ursprüngliche Tabelle oder ändern Sie das Synonym.
5. Erstellen Sie Tabellenindizes für die partitionierte Tabelle

Liest auch
Oracle Partition Index
Oracle Parallel Query
https://docs.oracle.com/cd/B28359_01/server.111/b32024/partition.htm