Mer datagenomströmning tack vare "parallella" PSQL-konstruktioner

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:

Tillgänglighet

Den nya funktionaliteten är tillgänglig från release 27.0.