sql >> Databáze >  >> RDS >> Oracle

Mají vnořené bloky nějaký vliv na výkon v procedurách PL/SQL?

Nezdá se, že:

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

Běží ve stejnou dobu, s trochou variací v každém směru, jako:

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

Samozřejmě je možné, že kompilátor odstraňuje nadbytečné vrstvy, ale nejsem si jistý, že to opravdu dokáže s obslužnými rutinami výjimek, protože by to ovlivnilo výsledek.

Neviděl jsem žádné omezení toho, jak hluboko mohou vnořené bloky jít - dokumentace jen říká, že bloky mohou být vnořeny. Model, který používáte, zachycení konkrétní chyby a umožnění šíření ostatním, je v pořádku a docela standardní - i když ve vašem vymyšleném příkladu to samozřejmě není nutné, ale víte to.




  1. Aktualizujte dotaz pomocí PDO a MySQL

  2. Změny licencí Common Sense pro SQL Server 2014 Standard Edition

  3. SQL seskupení na časový interval

  4. Jak rekurzivně odstranit položky z tabulky?