Samstag, Mai 14, 2011

Namensgebung für Interval Partitions

Beim Übertragen von Daten aus einer nicht partitionierten in eine (datumsbasiert) intervall-partitionierte Tabelle habe ich mich heute einmal mehr darüber geärgert, dass die system-generierten Intervall-Partitionsnamen keine Semantik enthalten, so dass ich nicht aus dem Partitionsnamen auf die enthaltenen Daten schliessen kann (man kann zwar in Oracle 11 Partitionen auch über eine neue FOR (datumsangabe) Syntax ansprechen, aber damit bin ich noch nicht völlig zufrieden). Um die Semantik zu ergänzen, wollte ich die Namen auf der Basis der HIGH_VALUE-Angaben aus USER_TAB_PARTITIONS ändern, was so einfach aber nicht geht, da HIGH_VALUE eine LONG-Spalte ist, mit der man nicht sehr viel anfangen kann - was man damit machen kann, hat Adrian Billington gelegentlich gezeigt - und da gäbe es sicher auch noch elegantere Lösungen, als die, auf die ich gekommen bin. Hier jedenfalls meine Variante:

-- Anlage einer Hilfstabelle mit den Partitionsnamen 
-- und den über to_lob umgewandelten HIGH_VALUE-Angaben
create table part_rename
as
select partition_name, to_lob(high_value) text
  from user_tab_partitions
 where table_name = 'MY_TABLE_NAME';

-- Generierung von Kommandos: ALTER TABLE ... RENAME PARTITION
-- da es sich um wochenbasierte Daten handelt, 
-- setze ich den Partitionsnamen auf HIGH_VALUE - 7 Tage
select 'alter table my_table_name rename partition '
       || partition_name 
       || ' TO my_table_name_p'
       || to_char(to_date(substr(text, 11, 10), 'yyyy-mm-dd') - 7, 'yyyymmdd') 
       || ';' text
  from part_rename
 order by 1;

-- Ausführung der generierten Kommandos
...
Beim Eintreffen neuer Daten jenseits der vorhandenen Intervall-Partitionen müsste man das natürlich wiederholen. Falls jemand eine bessere Lösung für das Problem kennt, würde ich mich über sachdienliche Hinweise freuen.

Keine Kommentare:

Kommentar veröffentlichen