Ver Mensaje Individual
  #3 (permalink)  
Antiguo 27/12/2007, 11:10
Avatar de matanga
matanga
 
Fecha de Ingreso: octubre-2007
Ubicación: España
Mensajes: 1.091
Antigüedad: 17 años
Puntos: 85
Re: Explain de un package

Hola,

Se ha mencionado el TKPROF en algunos post y me parecio buena idea postear un ejemplo.

Creo un procedimiento de prueba, no hace nada especial, pero sirve para el ejemplo, no hay diferencia entre hacer un trace para un procedimiento que para un package.

Código:
SQL> create or replace procedure p1
  2  as
  3  i number;
  4  begin
  5  select count(*) into i from dual;
  6  dbms_output.put_line(i);
  7  end;
  8  /

Procedure created.
Antes de generar una traza para una sesion, hay que modificar algunos parametros para asegurarnos un mejor resultado.

1. timed_statistics, habilita la captura de estadisticas de tiempos, cpu, etc.
2. max_dump_file_size, tamaño maximo del fichero de trace, si se llega al maximo Oracle lo truncara.
3. user_dump_dest, directorio donde se genera el fichero de trace.

Código:
SQL> alter session set timed_statistics=true;

Session altered.

SQL> alter session set max_dump_file_size=1024;

Session altered.

SQL> show parameter user_dump_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ---------------------------------
user_dump_dest                       string      /u01/app/oracle/admin/ORA10/udump
Una vez que tenemos configurado el entorno, podremos poner la sesion en trace, ejecutar el procedimiento, package, funcion, etc y volver a deshabilitar el trace sobre la sesion.

Código:
SQL> alter session set sql_trace=true;

Session altered.

SQL> begin
  2  p1;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> alter session set sql_trace=false;

Session altered.
Finalmente sobre el directorio de trazas, podremos ver el fichero generado con el nombre ora10_ora_2385.trc, al cual le aplico la herramienta de Oracle TKPROF con los siguientes parametros.

1. ora10_ora_2385.trc, fichero de entrada.
2. output.txt, fichero de salida.
3. explain=/, le pido los planes de ejecucion de las consultas SQL y para ello conectarse a la base de datos con /.
4. sys=no, no interpreta las llamadas de sys de Oracle.

Código:
oracle@buo:/u01/app/oracle/admin/ORA10/udump> ls -ltr
total 244
-rw-r-----  1 oracle oinstall 248470 2007-12-30 11:25 ora10_ora_2385.trc

oracle@buo:/u01/app/oracle/admin/ORA10/udump> tkprof ora10_ora_2385.trc output.txt explain=/ sys=no

TKPROF: Release 10.2.0.1.0 - Production on Sun Dec 30 11:27:51 2007

Copyright (c) 1982, 2005, Oracle.  All rights reserved.
Por ultimo, miramos el contenido del fichero output.txt, posteo nada mas que una parte, donde se puede ver el plan de ejecucion del SELECT COUNT(*) dentro del procedimiento P1.

Código:
oracle@buo:/u01/app/oracle/admin/ORA10/udump> more output.txt

SELECT COUNT(*) 
FROM
 DUAL


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0          0          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        3      0.00       0.00          0          0          0           1

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 31  (ORACLE)   (recursive depth: 1)

Rows     Execution Plan
-------  ---------------------------------------------------
      0  SELECT STATEMENT   MODE: ALL_ROWS
      0   SORT (AGGREGATE)
      0    FAST DUAL

********************************************************************************
Muy importante es leer mas sobre el TKPROF, tiene muchas mas opciones y formas de ordenar el fichero de output.


Saludos