miércoles, 2 de abril de 2014

Compilación Interpretada y Nativa en Oracle 11.2

Hay dos tipos de compilación, es decir, interpretada y nativa. Tras hacer una compilación nativa de un procedimiento, Oracle no tiene que interpretarlo antes de ejecutarlo. Por eso, el procedimiento puede terminar más rápidamente. La diferencia es más grande en procedimientos con cálculos y bucles etc y menos grande en procedimientos con SQL. Hice las pruebas bajo estas líneas para mostrar esta característica en Oracle 11.2. (Según la documentación escrita por Oracle, compilación nativa era diferente en versiones anteriores.) Para hacer unas compilaciones interpretadas, ejecuté el comando siguiente:

SQL> alter session set plsql_code_type = 'INTERPRETED'
  2  /

Sesión modificada.

SQL>

Luego creé un procedimiento con cálculos y bucles: 

SQL> create or replace procedure prueba_de_velocidad1 as
  2    z number;
  3  begin
  4    for x in 1..10000 loop
  5      for y in 1..10000 loop
  6        z := x * y;
  7      end loop;
  8    end loop;
  9  end;
 10  /

Procedimiento creado.

SQL>

... y otro con SQL:

SQL> create or replace procedure prueba_de_velocidad2 as
  2    cursor c1 is select a.table_name
  3    from dba_tables a, dba_tables b;
  4  begin
  5    for c1_rec in c1 loop
  6      null;
  7    end loop;
  8  end;
  9  /

Procedimiento creado.

SQL>

Para hacer unas compilaciones nativas, ejecuté el comando siguiente:

SQL> alter session set plsql_code_type = 'NATIVE'
  2  /

Sesión modificada.

SQL> create or replace procedure prueba_de_velocidad3 as
  2    z number;
  3  begin
  4    for x in 1..10000 loop
  5      for y in 1..10000 loop
  6        z := x * y;
  7      end loop;
  8    end loop;
  9  end;
 10  /

Procedimiento creado.

SQL> create or replace procedure prueba_de_velocidad4 as
  2    cursor c1 is select a.table_name
  3    from dba_tables a, dba_tables b;
  4  begin
  5    for c1_rec in c1 loop
  6      null;
  7    end loop;
  8  end;
  9  /

Procedimiento creado.

SQL>

Así tenía cuatro procedimientos:

  • Prueba_de_velocidad1: Compilación interpretada de cálculos y bucles.
  • Prueba_de_velocidad2: Compilación interpretada de SQL.
  • Prueba_de_velocidad3: Compilación nativa de cálculos y bucles.
  • Prueba_de_velocidad4: Compilación nativa de SQL.

Luego hice las pruebas:

SQL> set timing on
SQL> exec prueba_de_velocidad1;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:08.11
SQL> exec prueba_de_velocidad3;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:05.98
SQL> exec prueba_de_velocidad2;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:46.04
SQL> exec prueba_de_velocidad4;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:45.50
SQL>

...y miré los resultados:

  • Prueba_de_velocidad1: Compilación interpretada de cálculos y bucles: 8.11 segundos.
  • Prueba_de_velocidad3: Compilación nativa de cálculos y bucles: 5.98 segundos (una diferencia de 26%).
  • Prueba_de_velocidad2: Compilación interpretada de SQL: 46.04 segundos.
  • Prueba_de_velocidad4: Compilación nativa de SQL: 45.50 segundos (una diferencia de 1%).

Por fin, repetí las pruebas en el orden inverso pero los resultados eran iguales:

SQL> exec prueba_de_velocidad3;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:05.99
SQL> exec prueba_de_velocidad1;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:08.11
SQL> exec prueba_de_velocidad4;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:45.19
SQL> exec prueba_de_velocidad2;

Procedimiento PL/SQL terminado correctamente.

Transcurrido: 00:00:45.98
SQL> 
SQL> set timing off
SQL>

No hay comentarios:

Publicar un comentario