Not only developing

agosto 29, 2010

Oracle 10.2.0.4 – 10.2.0.5 : DML parallele all’interno dello scheduler

Filed under: Oracle — Etichette: , , — teox78 @ 10:00 pm

Al 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.

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.

3 commenti »

  1. Hi,

    did you solve this issue? We are experiencing the same problem.

    Thanks.
    D.

    Commento di dan — novembre 3, 2010 @ 7:10 pm

    • Well, the problem is that a procedure called through “execute immediate” inside the scheduler, will not have any parallelism, even if hints are used.
      In my opinion there are 2 possibilities :
      1) From the scheduler call directly the procedure
      2) (the one I used) : insted of using execute immediate I create a job (dbms_job.submit) and wait until it is over. That is to say :

      PROCEDURE proc_inside_scehduler() AS
      n_JobId NUMBER;
      n_Count NUMBER;
      BEGIN
      ….
      dbms_job.submit(n_JobId, ‘BEGIN my_parallel_prc(); end;’)
      n_Count := 1;
      WHILE n_Count > 0 loop
      Dbms_Lock.Sleep(5);
      SELECT COUNT(*) INTO n_Count
      FROM User_Jobs
      WHERE Job = n_JobId;
      end loop;

      END proc_inside_scehduler;

      I have written the example very quickly and just to give the logic; for example inside the loop we could put a timeout check…..
      I hope this will help you.
      By the way, I have moved the blog to this address

      Commento di teox78 — novembre 3, 2010 @ 8:13 pm

      • We are using dbms_job already and it seems that “sometimes” the parallel hints are ignored. Our monthly closing engine contains hundreds or more queries which are being executed in parallel using execute immediate. We are in a process of raising SR for this.

        Commento di dan — novembre 3, 2010 @ 8:35 pm


RSS feed dei commenti a questo articolo. TrackBack URI

Lascia un Commento

Fill in your details below or click an icon to log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Log Out / Modifica )

Foto Twitter

You are commenting using your Twitter account. Log Out / Modifica )

Foto di Facebook

You are commenting using your Facebook account. Log Out / Modifica )

Connecting to %s

Tema: Silver is the New Black. Blog su WordPress.com.

Follow

Get every new post delivered to your Inbox.