Oracle: Kako brzo unijeti podatke pomocu INSERT /*+ APPEND */
Friday, 09.02.2007 – DejanKaze 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.