Meer datadoorvoer dankzij "parallel" PSQL constructies

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:

Beschikbaarheid

De nieuwe functionaliteit is beschikbaar vanaf release 27.0.