sql >> Database teknologi >  >> RDS >> Oracle

Har indlejrede blokke nogen præstationspåvirkning i PL/SQL-procedurer?

De ser ikke ud til at:

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ører på samme tid, med lidt variation hver vej, 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

Det er selvfølgelig muligt, at compileren fjerner de overflødige lag, men jeg er ikke sikker på, at den virkelig kan med undtagelsesbehandlerne der, da det ville påvirke resultatet.

Jeg har ikke set nogen begrænsning for, hvor dybt indlejrede blokke kan gå - dokumentationen siger bare 'blokke kan indlejres'. Den model, du bruger, fanger en specifik fejl og lader andre udbrede sig, er fin og ret standard - selvom det naturligvis ikke er nødvendigt i dit konstruerede eksempel, men du ved det.




  1. Identificer telefonnumre i en PL/SQL-iteration

  2. Beregn dybde i en forældre-barn-model i MySQL

  3. Flyt tabel fra en database til en anden i MySQL

  4. Oracle SQL sammenligner datoer