Parallelle verwerking in PSQL verkort de doorlooptijd van batchwerk op een machine, met elegante foutafhandeling.
Invantive PSQL biedt nu parallelle verwerking: het samengestelde statement parallel ... branch ... end parallel voor ongelijksoortige blokken naast elkaar, en een parallel-clausule op beide for-lusvormen voor gelijksoortig werk per rij.
Het parallel Statement
Het parallel statement maakt het mogelijk om meerdere PSQL-blokken gelijktijdig te laten uitvoeren, elk ingeleid met branch en een optioneel label. Een (optioneel) getal achter parallel duidt het maximaal aantal parallelle uitvoeringen aan, zoals in:
begin
parallel 2
branch <<eerste>>
begin
dbms_output.put_line('eerste klaar');
end
branch <<tweede>>
begin
dbms_output.put_line('tweede klaar');
end
end parallel;
end;
De uitvoer luidt, waarbij de volgorde van de twee regels de voltooiingsvolgorde volgt en dus kan wisselen:
eerste klaar
tweede klaar
Zonder save exceptions stopt een falende branch het starten van nog niet begonnen branches; lopende branches maken hun werk af en daarna wordt de oorspronkelijke exception opnieuw geworpen, met de naam van de falende branch erbij. Bestaande foutafhandeling blijft daardoor werken.
Met save exceptions worden alle branches uitgevoerd; is er ten minste één mislukt, dan volgt een verzamel-exception parallel_error. Via de tabelfunctie dbms_parallel.saved_exceptions() kunnen de afzonderlijke fouten opgezocht worden.
Parallelle For-lussen
Het is ook mogelijk geworden om resultaten uit een for loop parallel te verwerken zoals met:
...
for r in
( select ...
)
parallel 8
save exceptions
loop
...
end loop;
...
dbms_lock
Synchronisatie tussen parallelle takken is mogelijk met nieuwe features van dbms_lock (zie Nieuwe vergrendelingsfuncties in dbms_lock: request, release, is_acquired en held_locks).
dbms_output
De dbms_output-regels van een parallelle actie worden als 1 uitvoer behandeld: ze worden per branch gebufferd en verschijnen als geheel zodra de branch klaar is.
Voorbeeld: Facturen Parallel Verwerken met Herstartbaarheid
Het volgende voorbeeld toont het patroon voor financiële verwerking per stuk: parallel over de rijen, alle rijen proberen met save exceptions, mislukkingen na afloop opsommen, en herstartbaarheid door een statusfilter zodat een herhaalde run alleen het restant oppakt:
declare
l_cnt number;
begin
create or replace table facturen@InMemoryStorage
as
select 1 factuur_id, 'OPEN' status from dual@DataDictionary
union all
select 2 factuur_id, 'OPEN' status from dual@DataDictionary
union all
select 3 factuur_id, 'OPEN' status from dual@DataDictionary
;
begin
for r in
( select fct.factuur_id
from facturen@InMemoryStorage fct
where fct.status = 'OPEN'
)
parallel 8
save exceptions
loop
--
-- Verwerking per factuur; factuur 2 mislukt hier opzettelijk.
--
declare
l_x number;
begin
l_x := 1 / (r.factuur_id - 2);
update facturen@InMemoryStorage
set status = 'VERWERKT'
where factuur_id = r.factuur_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 || ' factuur niet verwerkt; een volgende run pakt het restant op.');
end;
drop table facturen@InMemoryStorage;
end;
De uitvoer luidt:
1 factuur niet verwerkt; een volgende run pakt het restant op.
Rate Limiting
Parallellisme versnelt vooral werk met wachttijd, zoals aanroepen naar clouddiensten, en ongelijksoortige secties naast elkaar. De doorvoer naar één platform blijft beperkt door de limieten van dat platform; die limieten blijven onder parallel PSQL elden.
Zie ook
Zie ook de volgende onderwerpen:
- 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
Beschikbaarheid
De nieuwe functionaliteit is beschikbaar vanaf release 27.0.