sql >> Base de Datos >  >> RDS >> Oracle

¿Los bloques anidados tienen algún impacto en el rendimiento de los procedimientos PL/SQL?

No parecen:

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

Se ejecuta al mismo tiempo, con un poco de variación en cada sentido, como:

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

Por supuesto, es posible que el compilador elimine las capas redundantes, pero no estoy seguro de que realmente pueda hacerlo con los controladores de excepción, ya que afectaría el resultado.

No he visto ninguna limitación sobre la profundidad de los bloques anidados:la documentación simplemente dice "los bloques se pueden anidar". El modelo que está utilizando, detectando un error específico y permitiendo que otros se propaguen, está bien y es bastante estándar, aunque obviamente en su ejemplo artificial no es necesario, pero lo sabe.