Dienstag, Oktober 30, 2012

Split Partition und Indizes

Nur eine kurze Notiz: sofern man ins Kommando ALTER TABLE ... SPLIT PARTITION ...; nicht explizit die Option UPDATE INDEXES aufnimmt, führt das das Splitting zur Invalidierung der Indizes in der Quell- und in der Zielpartition, sofern anschließend in beiden Partitionen Werte enthalten sind:

-- 11.1.0.7
drop table test_mpr;

create table test_mpr (
    part_col number
  , col1 number
)
partition by list (part_col) 
(
    partition part_default values (default)
)
;
 
create index test_mpr_ix on test_mpr (
     col1
) local;
 
insert into test_mpr (part_col, col1) values (1, 1);
insert into test_mpr (part_col, col1) values (2, 2);
 
commit;

select partition_name
     , status 
  from user_ind_partitions
 where index_name = 'TEST_MPR_IX';

PARTITION_NAME                 STATUS
------------------------------ --------
PART_DEFAULT                   USABLE

alter table test_mpr 
split partition part_default values(1)
into (partition p1, partition part_default); 

select partition_name
     , status 
  from user_ind_partitions
 where index_name = 'TEST_MPR_IX';

PARTITION_NAME                 STATUS
------------------------------ --------
P1                             UNUSABLE
PART_DEFAULT                   UNUSABLE

Nach dem Split enthalten beide Tabellen-Partitionen je einen Satz und beide Index-Partitionen sind UNUSABLE. Anders verhält es sich, wenn die Default-Partition nach dem Split leer ist: dann behandelt Oracle die Operation offenbar als reine Umbenennung und die Indizes bleiben USABLE. Um die Indizes nach dem Split in jedem Fall funktionsfähig zu erhalten, dient die UPDATE INDEXES-Klausel:

alter table test_mpr
split partition part_default values(1)
into (partition p1, partition part_default)
update indexes;

PARTITION_NAME                 STATUS
------------------------------ --------
P1                             USABLE
PART_DEFAULT                   USABLE

Ob die Maintainance der Indizes im Fall der Verwendung von UPDATE INDEXES aufwändiger ist als bei einem kompletten Rebuild wäre gelegentlich auch noch interessant.

Nachtrag 31.10.2012: beim Vergleich der v$sesstat-Inhalte für den Fall der Verwendung von UPDATE INDEXES und den des expliziten REBUILD der Index-Partitionen nach einem Split ohne UPDATE INDEXES kann ich keine signifikanten Verarbeitungsunterschiede erkennen: anscheinend erfolgt in beiden Fällen ein kompletter Neuaufbau der Indizes. Das gilt auch für einen 99:1-Split, bei dem man argumentieren könnte, dass eine behutsame Aktualisierung des Index effizienter wäre. Allerdings würde das Verfahren dadurch natürlich auch komplizierter und fehleranfälliger.

Nachtrag 25.11.2012: für die Statistiken gelten ähnliche Gesetzmäßigkeiten: ein Split ohne Migration von Daten im Segment (also ein Split, der als Metadatenänderung nur einer Umbennenung entspricht), führt nicht zur Invalidierung der Statistiken. Wenn der Split aber Daten verschiebt, dann werden die Partitionsstatistiken gelöscht - ein Verhalten, das ich für völlig konsistent und schlüssig halte.

Keine Kommentare:

Kommentar veröffentlichen