Maggiore throughput dei dati con costrutti "paralleli" PSQL

L’elaborazione parallela in PSQL riduce i tempi di elaborazione dei batch su una macchina, con elegante gestione degli errori.

Invantive PSQL ora offre l’elaborazione parallela: l’istruzione composta parallel ... branch ... end parallel per blocchi eterogenei affiancati, e una clausola parallel su entrambe le forme di ciclo for per lavoro omogeneo per riga.

L’Istruzione parallel

L’istruzione parallel consente di eseguire contemporaneamente più blocchi PSQL, ciascuno introdotto da branch e un’etichetta opzionale. Un numero (opzionale) dietro parallel indica il numero massimo di esecuzioni parallele, come in:

begin
  parallel 2
  branch <<primo>>
    begin
      dbms_output.put_line('primo pronto');
    end
  branch <<secondo>>
    begin
      dbms_output.put_line('secondo pronto');
    end
  end parallel;
end;

L’output è il seguente, con l’ordine delle due righe che riflette l’ordine di completamento e quindi può variare:

primo pronto
secondo pronto

Senza save exceptions un branch che fallisce interrompe l’avvio di branch non ancora iniziati; i branch in esecuzione completano il loro lavoro e successivamente viene rilanciata l’eccezione originale, includendo il nome del branch che ha fallito. La gestione esistente degli errori continua a funzionare.

Con save exceptions tutti i branch vengono eseguiti; se almeno uno fallisce, segue un’eccezione collettiva parallel_error. Gli errori singoli possono essere trovati tramite la funzione di tabella dbms_parallel.saved_exceptions().

Cicli For Paralleli

È ora possibile elaborare i risultati di un ciclo for in parallelo come:

...
    for r in
    ( select ...
    )
    parallel 8
    save exceptions
    loop
    ...
    end loop;
...

dbms_lock

La sincronizzazione tra rami paralleli è possibile con le nuove funzionalità di dbms_lock (vedi Nieuwe vergrendelingsfuncties in dbms_lock: request, release, is_acquired en held_locks).

dbms_output

Le righe dbms_output di un’azione parallela vengono trattate come un output unico: vengono bufferizzate per branch e appaiono come un tutto una volta che il branch è completato.

Esempio: Elaborazione Parallela delle Fatture con Riavviabilità

Il seguente esempio mostra il modello per l’elaborazione finanziaria per singolo elemento: parallelamente sulle righe, tenta tutte le righe con save exceptions, elenca i fallimenti alla fine e riavviabilità tramite un filtro di stato in modo che un’esecuzione ripetuta riprenda solo il residuo:

declare
  l_cnt number;
begin
  create or replace table fatture@InMemoryStorage
  as
  select 1 fattura_id, 'APERTO' status from dual@DataDictionary
  union all
  select 2 fattura_id, 'APERTO' status from dual@DataDictionary
  union all
  select 3 fattura_id, 'APERTO' status from dual@DataDictionary
  ;
  begin
    for r in
    ( select fct.fattura_id
      from   fatture@InMemoryStorage fct
      where  fct.status = 'APERTO'
    )
    parallel 8
    save exceptions
    loop
      --
      -- Elaborazione per fattura; la fattura 2 fallisce qui intenzionalmente.
      --
      declare
        l_x number;
      begin
        l_x := 1 / (r.fattura_id - 2);
        update fatture@InMemoryStorage
        set    status = 'ELABORATO'
        where  fattura_id = r.fattura_id
        ;
      end;
    end loop;
  exception
    when parallel_error
    then
      l_cnt := 0;
      for f in
      ( select instance
        from   table(dbms_parallel.saved_exceptions())
      )
      loop
        l_cnt := l_cnt + 1;
      end loop;
      dbms_output.put_line(l_cnt || ' fattura non elaborata; una prossima esecuzione riprenderà il residuo.');
  end;
  drop table fatture@InMemoryStorage;
end;

L’output è:

1 fattura non elaborata; una prossima esecuzione riprenderà il residuo.

Limitazione della Velocità

Il parallelismo accelera soprattutto il lavoro con tempi di attesa, come le chiamate a servizi cloud, e sezioni eterogenee affiancate. Il throughput verso una singola piattaforma rimane limitato dai limiti di tale piattaforma; tali limiti rimangono validi sotto PSQL parallelo.

Vedi Anche

Vedi anche i seguenti argomenti:

Disponibilità

La nuova funzionalità è disponibile dalla versione 27.0.