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:
- 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
Tilgjengelighet
Den nye funksjonen er tilgjengelig fra og med versjon 27.0.