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
;