sql >> Databasteknik >  >> RDS >> Oracle

Har kapslade block någon prestandapåverkan i PL/SQL-procedurer?

De verkar inte:

set timing on
set serveroutput on

declare
  x number := 0;
begin
  dbms_output.put_line('No inner blocks');
  for i in 1..1000000 loop
    x := x + 1;
  end loop;
  dbms_output.put_line(x);
end;
/

anonymous block completed
Elapsed: 00:00:00.095
No inner blocks
1000000

Körs samtidigt, med lite variation åt varje håll, som:

declare
  x number := 0;
begin
  dbms_output.put_line('Nested inner blocks');
  for i in 1..1000000 loop
    begin
      begin
        begin
          begin
            x := x + 1;
          exception
            when others then
              raise;
          end;
        exception
          when others then
            raise;
        end;
      exception
        when others then
          raise;
      end;
    exception
      when others then
        raise;
    end;
  end loop;
  dbms_output.put_line(x);
end;
/

anonymous block completed
Elapsed: 00:00:00.090
Nested inner blocks
1000000

Naturligtvis är det möjligt att kompilatorn tar bort de redundanta lagren, men jag är inte säker på att det verkligen kan göra det med undantagshanterarna där eftersom det skulle påverka resultatet.

Jag har inte sett någon begränsning för hur djupt kapslade block kan gå - dokumentationen säger bara "block kan kapslas". Modellen du använder, fångar ett specifikt fel och låter andra sprida sig, är bra och ganska standard - även om det uppenbarligen inte är nödvändigt i ditt konstgjorda exempel, men du vet det.




  1. Klient med IP-adress tillåts inte komma åt serverns Azure SQL-databas

  2. JSON och ladda upp bilden till servern

  3. Hur byter man namn på uppladdad fil innan man sparar den i en katalog?

  4. Förorsakar PDO::beginTransaction() tabell- eller radlåsning tills PDO::commit()?