Oracle: Kako brzo unijeti podatke pomocu INSERT /*+ APPEND */

Friday, 09.02.2007 – Dejan

Kaze kolega:â€Cuo sam da je unos podataka sa INSERT /*+ APPEND */ veoma brz, ali kod mene se vuuuceeee kao penzioner na kraju mjeseca…â€

Pa evo zgodne prilike da na primjeru pojasnimo ispravno koristenje INSERT /*+ APPEND */ procesa.

U ovom primjeru imamo dvije tabele:
– source tabelu (source_table) iz koje uzimamo podatke, sa vise polja, od kojih su nama zanimljivi: id i iznos.
– target tabelu (target_table) u koju unosimo podatke iz source tabele, sa poljima: id,  suma_iznosa (suma svih iznosa za pojedini id) i max_iznos (maksimalni iznos za pojedini id).

Da bi unos bio sto brzi, potrebno je deaktivirati sve indekse i triggere na target tabeli.

Ako imamo samo jedan ili par indeksa, onda ih mozemo i rucno deaktivirati:

ALTER INDEX target_table_index1 UNUSABLE;

Ako imate particionisani index, onda ga mozete ovako deaktivirati:

ALTER INDEX target_table_index1 MODIFY PARTITION part1 UNUSABLE;

U suprotnom, za vise indeksa mozemo generisati kod:

sqlplus> spool c:\set_indexes_unusable.sql
sqlplus> SELECT 'ALTER INDEX '|| index_name ||' UNUSABLE;'
  FROM user_indexes
  WHERE table_name = 'TARGET_TABLE';
sqlplus> @C:\set_indexes_unusable.sql

Medjutim, Oracle ne dopusta unos podataka, ukoliko na tabeli postoje deaktivirani indexi (unusable indexes). Stoga moramo implicitno reci Oracleu, da preskoci deaktivirane indexe:

ALTER SESSION SET skip_unusable_indexes = TRUE;

Potom deaktiviramo triggere:

ALTER TABLE target_table DISABLE ALL TRIGGERS;

I mozemo poceti sa unosom:

INSERT /*+ APPEND */
INTO target_table(id, suma_iznosa, max_iznos)
SELECT id, sum(iznos), max(iznos)
FROM source_table
GROUP BY id;

Potvrdimo unos:

COMMIT;

I aktiviramo ponovo indexe i triggere:

ALTER TABLE target_table ENABLE ALL TRIGGERS;

sqlplus> spool C:\rebuild_indexes.sql
sqlplus> SELECT 'ALTER INDEX ' || index_name || ' REBUILD;'
  FROM user_indexes
  WHERE table_name = 'TARGET_TABLE'
  AND status = 'UNUSABLE';
sqlplus> @C:\rebuild_indexes.sql

To je to.


Post a Comment