Newsgroup: it.comp.software.database
Titolo: insert pesante e CPU al 90% su oracle

Ciao a tutti,
Eseguo queste 2 linee di codice da Oracle (non sono un esperto di questo 
RDBMS)
Da SQL Plus:
insert into <table1> (id, day, value)
select id, to_date(day,'YYYYMMDD'), value/10 from <table2>;
commit;
La tabella2 ha quasi 30 milioni di righe
La tabella1 non ha indici nella fase di insert, si creeranno dopo le insert.
Come ottimizzare questa procedura?
Riduce il DB su un server "cluster e potente", come se stesse girando su un 
palmare!
Grazie

 commit;
[/CUT]
Ciao Davide,
puoi usare hint nella insert, ad esempio la APPEND.
insert /*+ APPEND */ into <table1> (id, day, value)
select id, to_date(day,'YYYYMMDD'), value/10 from <table2>;
oppure la PARALLEL che ti permette di creare più sessioni parallele che
fanno l'inserimento del dato.
ma fai attenzione che l'hint append scrivendo direttamente sul datafile
ti può creare frammentazione.
uhm potresti anche creare un index function value/10 se già non esiste.
spero di averti dato eei suggerimenti utili e corretti. Al max aspetta
il consiglio di qlcn altro non sono un esperto ;)
hope this help!


Non vedo grandi margini di miglioramento sul lato SQL.
Indici sulla tabella sorgente non ti aiuteranno molto visto che esegui 
una full table scan.
Al massimo potresti passare a una fast full scan che ti aiuterebbe solo 
nel caso in cui table2 contenga molti piu' campi rispetto ai tre che estrai.
Puoi descrivere il problema di performance?
Immagino siano i tempi di risposta che non ti soddisfano ma il DB e il 
sistema operativo cosa fanno?
CPU? Usata al 100%? In idle?
Hai i/o wait sui dischi?
Quali sono i maggiori eventi di wait all'interno del DB durante la insert?
Memoria? Stai swappando?
Forse la soluzione del tuo problema e' piu' sistemistica che applicativa.
Hai parlato di cluster. Che tipo? RAC? Versione? 10g?
Sistema operativo?
Usi asynch i/o? E direct I/O?
Il layout dei dischi potrebbe aiutarti se hai problemi di scrittura.
Sono dischi interni o sei su SAN?
Alcune feature potrebbero appesantirti.
Stai usando ASM con mirror? Flashback database?
Ciao
-- 
Fabrizio Magni
fabrizi...@mycontinent.com
replace mycontinent with europe

 hope this help!
Ciao,
Vi ringrazio per i preziosi suggerimenti!
Davide 

forse dovresti gestire l'insert con una proceura plsql che committa
ogni tanto, credo che il tuo problema sia il segmento di rollback che
cresce a dismisura...
guarda anche come cresce il tablespace (sarebbe bene cercare di fare
meno estensioni possibile)

Trattandosi di una megainsert da 30M di record, mi sembra normale che
ti occupi tutte le risorse... E' un'operazione da compiere al di fuori
degli orari operativi (di sera/notte) e magari inserendo una Commit
ogni 5-10 mila record.
La append è un buon consiglio. Non scrive direttamente del datafile
come dice Soulsacrifire, ma piuttosto evita che Oracle perda tempo a
inserire i record negli spazi vuoti degli extent, ma alloca nuovi
extent al di sopra dell' HWM.
Se si tratta di una tabella nuova da riempire, o se la tabella da
riempire è semivuota, ti consiglio una CTAS ovvero crea una tabella
nuova con Create table Nuovatabella AS Select ... From  Tabella2.
Poi inserisci qui dentro gli altri record della Tabella1, e rinomini le
due tabelle.
Ciao