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:
- Parallel Statement (pSqlParallelStatement) - Invantive Product Documentation
- dbms_parallel - Invantive Product Documentation
- dbms_lock - Invantive Product Documentation
- Nieuwe vergrendelingsfuncties in dbms_lock: request, release, is_acquired en held_locks
Disponibilità
La nuova funzionalità è disponibile dalla versione 27.0.