Freitag, August 13, 2010

Interval Partitions

Partitionen sind eines der wichtigsten Hilfsmittel, um große Datenmengen sinnvoll verwalten und performant abfragen zu können. In Oracle 11 gibt es nun (endlich) die Möglichkeit, Partitionen bei Bedarf automatisch vom System anlegen zu lassen. Dazu ein kleines Beispiel: Ich lege eine partitionierte Tabelle mit genau einer Spalte, einer Partition und einer Intervall-Angabe an:

SQL> r
  1  create table test_interval_partition
  2  (col1 number)
  3  partition by range (col1)
  4  interval (1000)
  5  (partition test_p1 values less than (1000)
  6* )

Tabelle wurde erstellt.

"Interval" gibt dabei an, welchen Bereich ein automatisch angelegtes Intervall umfassen soll. Bei der Füllung der Tabelle werden nun nach Bedarf neue Intervalle angelegt. Zunächst ein Wert, der in die initial angelegte Partition fällt:

SQL> insert into TEST_INTERVAL_PARTITION values (999);

1 Zeile wurde erstellt.

SQL> select table_name
  2       , partition_name
  3       , HIGH_VALUE
  4       , PARTITION_POSITION
  5    from user_tab_partitions t
  6   where table_name = 'TEST_INTERVAL_PARTITION';

TABLE_NAME                     PARTITION_NAME  HIGH_VALUE PARTITION_POSITION
------------------------------ --------------- ---------- ------------------
TEST_INTERVAL_PARTITION        TEST_P1         1000                        1

Jetzt folgt ein Wert, der außerhalb der ersten Partition liegt:

SQL> insert into TEST_INTERVAL_PARTITION values (1000);

1 Zeile wurde erstellt.

SQL> select table_name
  2       , partition_name
  3       , HIGH_VALUE
  4       , PARTITION_POSITION
  5    from user_tab_partitions t
  6   where table_name = 'TEST_INTERVAL_PARTITION';

TABLE_NAME                     PARTITION_NAME  HIGH_VALUE PARTITION_POSITION
------------------------------ --------------- ---------- ------------------
TEST_INTERVAL_PARTITION        TEST_P1         1000                        1
TEST_INTERVAL_PARTITION        SYS_P25         2000                        2

Um den Wert unterbringen zu können, legt das System eine neue Partition SYS_P25 an, die erwartungsgemäß an Position 2 erscheint. Nun ein deutlich höherer Wert:

SQL> insert into TEST_INTERVAL_PARTITION values (10000);

1 Zeile wurde erstellt.

SQL> select table_name
  2       , partition_name
  3       , HIGH_VALUE
  4       , PARTITION_POSITION
  5    from user_tab_partitions t
  6   where table_name = 'TEST_INTERVAL_PARTITION';

TABLE_NAME                     PARTITION_NAME  HIGH_VALUE PARTITION_POSITION
------------------------------ --------------- ---------- ------------------
TEST_INTERVAL_PARTITION        TEST_P1         1000                        1
TEST_INTERVAL_PARTITION        SYS_P25         2000                        2
TEST_INTERVAL_PARTITION        SYS_P26         11000                       3

Das System legt eine weitere Partition SYS_P26 an Position 3 an. Jetzt ein Wert für den Raum zwischen den beiden automatisch erzeugten Partitionen:

SQL> insert into TEST_INTERVAL_PARTITION values (5000);

1 Zeile wurde erstellt.

SQL> select table_name
  2       , partition_name
  3       , HIGH_VALUE
  4       , PARTITION_POSITION
  5    from user_tab_partitions t
  6   where table_name = 'TEST_INTERVAL_PARTITION';

TABLE_NAME                     PARTITION_NAME  HIGH_VALUE PARTITION_POSITION
------------------------------ --------------- ---------- ------------------
TEST_INTERVAL_PARTITION        TEST_P1         1000                        1
TEST_INTERVAL_PARTITION        SYS_P25         2000                        2
TEST_INTERVAL_PARTITION        SYS_P27         6000                        3
TEST_INTERVAL_PARTITION        SYS_P26         11000                       4

Die neue Partition SYS_P27 rückt an Position 3 und SYS_P26 auf Position 4.

Funktioniert also alles ziemlich genau so, wie man es erwarten würde. Interval Partitioning funktioniert übrigens nur für NUMBER und DATE Partitionsschlüssel, aber andere würde ich ohnehin nicht definieren wollen.

In Harald van Breederodes Blog finden sich übrigens noch ein paar interessante Hinweise zum Löschen von interval partitions:
Und im Rittman Blog schreibt Peter Scott über den Neuaufbau von lokalen Indizes für interval partitions:

    Keine Kommentare:

    Kommentar veröffentlichen