domingo, 19 de abril de 2009

PL/SQL: Performance: Paso de parámetros con NOCOPY

Los parámetros en los programas PL/SQL en modo IN pasan por referencia, en cambio, los parámetros en modo OUT o IN OUT pasan por "valor", es decir, se hace una copia completa de la(s) variable(s)al hacer la llamada (runtime del PL/SQL). Esto implica tiempo y recursos, sobre todo cuando un programa pasa una estructura "pesada" y es llamado muchas veces. En la mayoría de los casos esto se puede mejorar usando NOCOPY. Para mostrar esto, podemos usar una colección (arreglo en otros lenguajes) de registros y declarar una variable que será pasada como parámetro de entrada/salida (IN OUT) y tomar los tiempos de ejecución sin y con NOCOPY
   PROCEDURE parametros_x_valor ( 
      p_productos   IN OUT   productos_ct
   );

   PROCEDURE parametros_x_referencia (
      p_productos   IN OUT NOCOPY   productos_ct
   );
Ver ejemplo: nocopy.sql El resultado en tiempo es:
Carga de colección con:100000 regs:Tiempo:0 segundos.
Tiempo Parámetro x Valor:Tiempo:29 segundos.
Tiempo Parámetro x Referencia:Tiempo:6 segundos.
Observación: Si un programa recibe variables por referencia y termina con error por una excepción, los valores modificados persisten en el procedimiento que efectuó la llamada y esto puede producir problemas colaterales si el proceso continúa.

No hay comentarios:

Publicar un comentario