partition exchange - Tabelle aus Range-Partition in Range-List-Partition umbauen

Nachdem bereits Range-Partitionen in einer Tabelle existieren, sollen zusätzliche Daten in Subpartitionen strukturiert werden:

Mögliches Vorgehen unter 10gR2 unter der Voraussetzung, dass die bestehenden Daten später in genau einer Subpartition landen werden:
  1. unpartitionierte Temp-Tabelle erstellen
  2. bestehende Partition der Quelltabelle in Temp-Tabelle überführen (per exchange)
  3. Quelltabelle in neuer Struktur (mit Subpartitionen) neu erstellen
  4. Temp-Tabelle (per exchange) als Subpartition in neu erstellte Tabelle einfügen
Da alles über Tabellenmetadaten läuft und somit keine Daten kopiert bzw. physikalisch verschoben, sollte die Datenmenge keine Rolle spielen.


Beispiel:
-- Ausgangstabelle erstellen
DROP TABLE fs_ptest;
CREATE TABLE fs_ptest
(
quartal NUMBER (5),
fallstatus varchar2(3),
bsnr VARCHAR2 (9),
lanr VARCHAR2 (9)
)
PARTITION BY RANGE (quartal) (PARTITION pmaxval
VALUES LESS THAN (maxvalue)
TABLESPACE ammmaxval_d_l);

insert into fs_ptest values (20091, 'FIS', 1,1);
insert into fs_ptest values (20091, 'FIS', 2,1);
insert into fs_ptest values (20091, 'FIS', 3,1);
insert into fs_ptest values (20092, 'FIS', 1,2);
insert into fs_ptest values (20092, 'FIS', 2,2);
insert into fs_ptest values (20092, 'FIS', 3,2);
commit;

-- temp Tabelle in Struktur der alten Tabelle, aber ohne Partitionen erstellen
DROP TABLE fs_ptest_pmaxval;
CREATE TABLE fs_ptest_pmaxval
(
quartal NUMBER (5),
fallstatus varchar2(3),
bsnr VARCHAR2 (9),
lanr VARCHAR2 (9)
);

-- relevante Partition rausziehen:
ALTER TABLE fs_ptest EXCHANGE PARTITION pmaxval WITH TABLE fs_ptest_pmaxval;

-- leere Zieltabelle im neuen Format erstellen
DROP TABLE fs_ptest;
CREATE TABLE fs_ptest
(
quartal NUMBER (5),
fallstatus varchar2(3),
bsnr VARCHAR2 (9),
lanr VARCHAR2 (9)
)
LOGGING
PARTITION BY RANGE (quartal)
SUBPARTITION BY LIST (fallstatus)
subpartition template
(
subpartition fis values ('FIS')
, subpartition ber values ('BER')
, subpartition xxx values (default)
)
(
PARTITION pmaxval VALUES LESS THAN (maxvalue)
);

-- Temp-Tabelle in neue Zieltabelle überführen
ALTER TABLE fs_ptest EXCHANGE SUBPARTITION PMAXVAL_FIS WITH TABLE fs_ptest_pmaxval;

-- tmp-Tabelle wieder löschen
DROP TABLE fs_ptest_pmaxval;

Bei mehreren Partitionen und bestehenden Daten, die in mehrere Subpartitionen einsortiert werden sollen, wird der Vorgang entsprechend aufwändiger.

Kommentare

Beliebte Posts aus diesem Blog

trunc(sysdate) - nette Spiele mit dem Datum

Zufallszahlen und -text generieren - DBMS_RANDOM

Laufzeiten umrechnen, Sekundenangaben lesbar darstellen