Elég nehéz az Oracle jó oldalait kidomborítani, és nem is nagyon akarom megpróbálni, de az alábbi Oracle-specifikus megoldást elegánsnak mondanám. Az alapprobléma: időszakonként összegyűjtünk néhány millió rekordot (snapshot, pillanatkép), és betöltjük őket egy nagy táblába.
A használt táblák
Az első lépések egyszeri DDL-ek. Először is van egy lista-particionált végtáblánk:
-- list partitioned target table
create table d_table
(
quarter char(4) not null,
contract_id char(6) not null,
-- etc...
constraint d_table_pk primary key (quarter, contract_id)
)
partition by list (quarter)
(
partition p_22q1 values ('22q1')
)
;
Ehhez így hozhatunk létre egy tranzakciós segédtáblát:
-- non-partitioned, nologging metadata clone of the target table
create table t_table
for exchange
with table d_table
;
--a kulcs része kell legyen a partíciós attribútum (quarter)
alter table t_table
add constraint t_table_pk primary key (quarter, contract_id)
;
Betöltési séma
A további lépések ismételhetők némi PL/SQL kód hozzáadásával.
A segédtáblát feltöltjük az aktuális adatokkal:
alter table t_table
modify primary key disable
;
--első alkalommal nincs szerepe, de minden további iterációnál van
truncate table t_table
;
-- direct-path insert
insert --+ parallel
into t_table (
quarter
,contract_id
-- etc...
)
select --+ parallel
'22q2'
,s.contract_id
-- etc...
from src_table s
;
alter table t_table
modify primary key enable
;
Végül a segédtáblát becseréljük egy partícióra (nem feltétlen kell újnak vagy üresnek lennie):
--PL/SQL segítségével ellenőrizhető a partíció létezése
alter table d_table
add partition p_22q2 values ('22q2')
;
--becseréljük
alter table d_table
exchange partition p_22q2
with table t_table
including indexes without validation
;