l fine di velocizzare alcuni processi che girano di notte su un db Oracle ( 10.2.0.4) , ho deciso di eseguire alcune DML in parallelo. Sostanzialmente , le modifiche che apporto sono due :
- abilitare le DML parallele :
Alter session enable parallel DML; - Aggiungere l’hint alla query :
INSERT /*+ PARALLEL(a, 4) */ INTO mytable a ....
Prima di tutto eseguo la procedure da sqlplus e vedo che funziona tutto alla perfezione ma non appena viene inserita all’interno dello scheduler, la procedura va a buon fine ma senza alcun parallelismo e quindi senza alcuna riduzione dei tempi rispetto a quella originale.
Cerco il problema su google e scopro che facendo l’upgrade alla versione 10.2.0.5 di Oracle, si ha la possibilità di eseguire DML parallele anche ll’interno di “Transazioni autonome” e quindi anche all’interno dello scheduler.
Eseguo l’upgrade e riprovo ma senza successo. Facendo altri test, capisco che il problema è dato dal fatto che chiamo la procedura tramite Execute immediate.
Cerco il problema su google e scopro che facendo l’upgrade alla versione 10.2.0.5 di Oracle, si ha la possibilità di eseguire DML parallele anche ll’interno di “Transazioni autonome” e quindi anche all’interno dello scheduler.
Eseguo l’upgrade e riprovo ma senza successo. Facendo altri test, capisco che il problema è dato dal fatto che chiamo la procedura tramite Execute immediate.
Per riassumere : se uno procedura invocata dallo scheduler chiama un’altra procedura tramite il comando Execute Immediate, le query/dml parallele all’interno di quest’ultima procedura non verranno eseguite in parallelo. Se invece si chiamasse direttamente la procedura senza l’uso del comando execute immediate, tutto funzionerebbe come ci si aspetta.
Nessun commento:
Posta un commento