Mer datagjennomstrømming takket være "parallelle" PSQL-konstruksjoner

Parallell behandling i PSQL reduserer gjennomføringstiden for batchbehandling på en maskin, med elegant feilbehandling.

Invantive PSQL tilbyr nå parallell behandling: den sammensatte setningen parallel ... branch ... end parallel for heterogene blokker side ved side, og en parallel-klausul på begge for-løkkeformer for homogene oppgaver per rad.

parallel-setningen

parallel-setningen gjør det mulig å utføre flere PSQL-blokker samtidig, hver introdusert med branch og en valgfri etikett. Et (valgfritt) tall etter parallel angir maksimalt antall parallelle utførelser, som vist i:

begin
  parallel 2
  branch <<første>>
    begin
      dbms_output.put_line('første klar');
    end
  branch <<andre>>
    begin
      dbms_output.put_line('andre klar');
    end
  end parallel;
end;

Utdataene ser slik ut, hvor rekkefølgen på de to linjene følger fullføringsrekkefølgen og dermed kan variere:

første klar
andre klar

Uten save exceptions stopper en feilet branch oppstarten av ennå ikke påbegynte branches; pågående branches fullfører sitt arbeid og deretter kastes den opprinnelige exceptionen på nytt, med navnet på den feilede branchen inkludert. Eksisterende feilbehandling fortsetter å fungere.

Med save exceptions utføres alle branches; hvis minst én mislykkes, følger en samlet exception parallel_error. Gjennom tabellfunksjonen dbms_parallel.saved_exceptions() kan de individuelle feilene finnes.

Parallelle For-løkker

Det er også blitt mulig å behandle resultater fra en for-løkke parallelt som vist i:

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

dbms_lock

Synkronisering mellom parallelle forgreninger er mulig med nye funksjoner i dbms_lock (se Nieuwe vergrendelingsfuncties in dbms_lock: request, release, is_acquired en held_locks).

dbms_output

dbms_output-linjene fra en parallell handling behandles som 1 utgang: de bufres per branch og vises som en helhet når branchen er ferdig.

Eksempel: Behandle Fakturaer Parallelt med Gjenstartbarhet

Det følgende eksempelet viser mønsteret for finansiell behandling per enhet: parallelt over radene, prøver alle rader med save exceptions, oppsummerer feil etter ferdigstillelse, og gjenstartbarhet gjennom et statusfilter slik at en ny kjøring kun tar opp restene:

declare
  l_cnt number;
begin
  create or replace table fakturaer@InMemoryStorage
  as
  select 1 faktura_id, 'ÅPEN' status from dual@DataDictionary
  union all
  select 2 faktura_id, 'ÅPEN' status from dual@DataDictionary
  union all
  select 3 faktura_id, 'ÅPEN' status from dual@DataDictionary
  ;
  begin
    for r in
    ( select fct.faktura_id
      from   fakturaer@InMemoryStorage fct
      where  fct.status = 'ÅPEN'
    )
    parallel 8
    save exceptions
    loop
      --
      -- Behandling per faktura; faktura 2 mislykkes her med vilje.
      --
      declare
        l_x number;
      begin
        l_x := 1 / (r.faktura_id - 2);
        update fakturaer@InMemoryStorage
        set    status = 'BEHANDLET'
        where  faktura_id = r.faktura_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 || ' faktura ikke behandlet; en neste kjøring tar opp restene.');
  end;
  drop table fakturaer@InMemoryStorage;
end;

Utdataene er:

1 faktura ikke behandlet; en neste kjøring tar opp restene.

Hastighetsbegrensning

Parallellitet akselererer spesielt arbeid med ventetid, som oppkall til skytjenester, og heterogene seksjoner side ved side. Gjennomstrømningen til en enkelt plattform forblir begrenset av plattformens begrensninger; de begrensningene fortsetter under parallell PSQL.

Se også

Se også følgende emner:

Tilgjengelighet

Den nye funksjonen er tilgjengelig fra og med versjon 27.0.