Parallell bearbetning i PSQL förkortar genomloppstiden för batcharbeten på en maskin, med elegant felhantering.
Invantive PSQL erbjuder nu parallell bearbetning: det sammansatta uttalandet parallel ... branch ... end parallel för heterogena block sida vid sida, och en parallel-klausul på båda for-loopformerna för homogent arbete per rad.
parallel-Uttalandet
parallel-uttalandet gör det möjligt att köra flera PSQL-block samtidigt, var och en inledd med branch och en valfri etikett. Ett (valfritt) tal efter parallel anger det maximala antalet parallella körningar, som i:
begin
parallel 2
branch <<första>>
begin
dbms_output.put_line('första klar');
end
branch <<andra>>
begin
dbms_output.put_line('andra klar');
end
end parallel;
end;
Utdata lyder, där ordningen på de två raderna följer färdigställandeordningen och därför kan variera:
första klar
andra klar
Utan save exceptions stoppar en felande branch starten av de grenar som inte har börjat; pågående grenar slutför sitt arbete och därefter kastas det ursprungliga undantaget igen, med namnet på den felande branchen inkluderat. Befintlig felhantering fortsätter därför att fungera.
Med save exceptions körs alla grenar; om det finns minst en misslyckande följer ett samlingsundantag parallel_error. Via tabellfunktionen dbms_parallel.saved_exceptions() kan de enskilda felen hittas.
Parallella For-loopar
Det har också blivit möjligt att bearbeta resultat från en for-loop parallellt, som med:
...
för r i
( select ...
)
parallel 8
save exceptions
loop
...
end loop;
...
dbms_lock
Synkronisering mellan parallella grenar är möjlig med nya funktioner av dbms_lock (se Nieuwe vergrendelingsfuncties in dbms_lock: request, release, is_acquired en held_locks).
dbms_output
dbms_output-raderna från en parallell åtgärd behandlas som en utmatning: de buffras per branch och visas som en helhet så snart branchen är klar.
Exempel: Behandla Fakturor Parallellt med Återstartsbarhet
Följande exempel visar mönstret för finansiell bearbetning per enhet: parallellt över raderna, alla rader försöker med save exceptions, redovisar misslyckanden i efterhand, och återstartsbarhet genom ett statusfilter så att en upprepad körning bara tar hand om resterande:
declare
l_cnt number;
begin
create or replace table fakturor@InMemoryStorage
as
select 1 faktura_id, 'OPEN' status from dual@DataDictionary
union all
select 2 faktura_id, 'OPEN' status from dual@DataDictionary
union all
select 3 faktura_id, 'OPEN' status from dual@DataDictionary
;
begin
för r i
( select fct.faktura_id
från fakturor@InMemoryStorage fct
där fct.status = 'OPEN'
)
parallel 8
save exceptions
loop
--
-- Bearbetning per faktura; faktura 2 misslyckas här medvetet.
--
declare
l_x number;
begin
l_x := 1 / (r.faktura_id - 2);
update fakturor@InMemoryStorage
set status = 'BEARBETAD'
där faktura_id = r.faktura_id
;
end;
end loop;
exception
när parallel_error
då
l_cnt := 0;
för f i
( select instance
från table(dbms_parallel.saved_exceptions())
)
loop
l_cnt := l_cnt + 1;
end loop;
dbms_output.put_line(l_cnt || ' faktura inte bearbetad; en nästa körning tar hand om resterande.');
end;
drop table fakturor@InMemoryStorage;
end;
Utdata lyder:
1 faktura inte bearbetad; en nästa körning tar hand om resterande.
Begränsning av Hastighet
Parallellism accelererar särskilt arbete med väntetid, som anrop till molntjänster, och heterogena sektioner sida vid sida. Genomströmningen till en plattform förblir begränsad av plattformens gränser; dessa gränser förblir under parallell PSQL oförändrade.
Se även
Se även följande ämnen:
- 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
Tillgänglighet
Den nya funktionaliteten är tillgänglig från release 27.0.