You are on page 1of 46

EXPLAIN PLAN

Cmo obtener el EXPLAIN PLAN? Aunque el proceso mostrado es simple, es recomendable utilizar herramientas de terceros las cuales facilitan aun ms el trabajo. De hecho los planes de ejecucin generados por terceros son ms ilustrativos que los generados por Oracle.

Observemos a continuacin un ejemplo de un EXPLAN PLAN generado por la herramienta JDeveloper de Oracle.

EXPLAIN PLAN
Uso de un hint, se vern posteriormente

Podemos observar que los resultados obtenidos con esta herramienta, son ms amigables que los obtenidos mediante SQL*Plus.

EXPLAIN PLAN
Cmo leer el resultado del EXPLAIN PLAN? Interpretar un plan de ejecucin, generalmente requiere prctica. A pesar de esto, he aqu algunas pautas generales que ayudan a interpretarlo. 1. Mientras ms indentado se encuentre un ruta de acceso (access path), ms tempranamente se ejecuta. 2. Si dos pasos estn indentados a un mismo nivel, la sentencia que se encuentre ms arriba se ejecutar primero.

Observemos un ejemplo:

EXPLAIN PLAN
Cmo leer el resultado del EXPLAIN PLAN? Supongamos la consulta: SELECT nombre, ciudad, departamento FROM compania WHERE ciudad = 'medellin' AND departamento = 'antioquia';

EXPLAIN PLAN
Cmo leer el resultado del EXPLAIN PLAN? Un plan de ejecucin posible, podra ser el siguiente: query_plan -------------------------------------------TABLE ACCES COMPANIA BY ROWID AND-EQUAL INDEX RANGE SCAN COMPANIA$CIUDAD INDEX RANGE SCAN COMPANIA$DEPARTAMENTO

EXPLAIN PLAN
Cmo leer el resultado del EXPLAIN PLAN? Siguiendo las pautas observadas, se puede decir lo siguiente sobre este plan de ejecucin: 1. Los accesos ms indentados son los INDEX RANGE SCAN y como se encuentran al mismo nivel, entonces el primero que se ejecutar ser: INDEX RANGE SCAN COMPANIA$CIUDAD 2. Y luego: INDEX RANGE SCAN COMPANIA$DEPARTAMENTO

EXPLAIN PLAN
Cmo leer el resultado del EXPLAIN PLAN? 3. Luego, se tiene que los resultados de ambas operaciones, le suministraran informacin a la operacin AND_EQUAL. 4. AND_EQUAL a su vez, le entregar informacin a la operacin TABLE ACCES COMPANIA BY ROWID

En algunas ocasiones, es necesario tener en cuenta otros factores a la hora de interpretar un plan de ejecucin. Observemos otro ejemplo

EXPLAIN PLAN
Cmo leer el resultado del EXPLAIN PLAN? Observemos el siguiente plan de ejecucin:
query_plan ------------------------------------------------SELECT STATEMENT SORT ORDER BY NESTED LOOPS TABLE ACCESS FULL CLIENTE TABLE ACCESS BY ROWID EMPLEADOS INDEX RANGE SCAN EMPLEADO_NOMBRES_IDX

EXPLAIN PLAN
Cmo leer el resultado del EXPLAIN PLAN? Una ruta de acceso puede estar compuesta por varios pasos en el plan de ejecucin. Si observamos detenidamente el resultado del EXPLAIN PLAN anterior y siguiendo las dos pautas antes mencionadas se podra pensar que lo primero que se ejecuta sera: INDEX RANGE SCAN EMPLEADO_NOMBRES_IDX Sin embargo, esta instruccin hace parte, o mejor dicho, se ejecuta de manera conjunta con la instruccin: TABLE ACCESS BY ROWID EMPLEADOS

EXPLAIN PLAN
Cmo leer el resultado del EXPLAIN PLAN? Por consiguiente al ser una operacin conjunta, esta se tomar como un grupo, es decir, como una sola operacin. 1. Por lo tanto, la primera operacin a ejecutarse ser:

TABLE ACCESS FULL CLIENTE


Ya que se encuentra al mismo nivel que la operacin conjunta formada por: TABLE ACCESS BY ROWID EMPLEADOS INDEX RANGE SCAN EMPLEADO_NOMBRES_IDX

EXPLAIN PLAN
Cmo leer el resultado del EXPLAIN PLAN? Luego de haber entendido lo anterior, los pasos en los que se ejecutar la consulta son:
SELECT STATEMENT SORT ORDER BY NESTED LOOPS TABLE ACCESS FULL CLIENTE TABLE ACCESS BY ROWID EMPLEADOS INDEX RANGE SCAN EMPLEADO_NOMBRES_IDX

4 3 1 2

Miremos ahora un ltimo ejemplo:

EXPLAIN PLAN
Cmo leer el resultado del EXPLAIN PLAN?
query_plan --------------------------------------------PROJECTION SORT UNIQUE UNION MERGE JOIN SORT JOIN TABLE ACCESS FULL COMPANIA SORT JOIN TABLE ACCESS FULL VENTAS TABLE ACCESS BY ROWID COMPETIDOR INDEX UNIQUE SCAN COMPETIDOR_PK

EXPLAIN PLAN
Otros Aspectos acerca del EXPLAIN PLAN

Como se observ, el EXPLAIN PLAN ofrece informacin que puede ser de utilidad a la hora de obtener una idea del rendimiento de la consulta ejecutada. Dichos datos provienen de las columnas de la tabla del EXPLAIN PLAN y son:

Costo - Cardinalidad - Bytes


Sin embargo, estos simplemente dan una idea superficial de que es lo que ocurre al ejecutar una sentencia, por lo tanto es necesario apoyarse en otras herramientas (que se vern a continuacin) para formarse una mejor idea sobre el rendimiento de una consulta.

SQL TRACE Y TKPROF


Aunque el EXPLAIN PLAN es una herramienta til, posee limitantes que hacen que sea un instrumento incompleto para la toma de decisiones acerca de los planes de ejecucin Por ejemplo, no es posible determinar adecuadamente entre dos planes de ejecucin, cual es ms eficiente, por ello se puede acudir a otras dos herramientas: el SQL TRACE y TKPROF
Con estas herramientas se puede obtener informacin acerca de los recursos utilizados por el sistema (memoria, CPU, etc.), tiempos de parsing, de recuperacin de registros y de ejecucin

SQL TRACE Y TKPROF


SQL TRACE El SQL TRACE es una herramienta que permite rastrear las sentencias SQL ejecutadas dentro de una sesin o instancia, almacenndolas dentro de un archivo especfico*. En este archivo se guardan varios elementos interesantes, tales como: tiempos de CPU, de entradas y salidas de disco, parsing, procesamiento de registros etc.

* Generalmente, estos archivos de rastreo tienen extensin trc

SQL TRACE Y TKPROF


SQL TRACE
El archivo generado por el SQL TRACE es bsicamente, imposible de interpretar directamente. Esto se puede comprobar abriendo el archivo con cualquier editor de texto plano. Ejemplo:

SQL TRACE Y TKPROF


SQL TRACE Debido a que la salida del archivo de rastreo es prcticamente ilegible, se debe utilizar una herramienta de formateo que toma como entrada, el archivo de rastreo y va a generar un archivo con informacin comprensible y fcil de interpretar que se espera conlleve a la toma de buenas decisiones.

Esta herramienta de formateo (proporcionada tambin por Oracle) es conocida como TKPROF

SQL TRACE Y TKPROF


Pasos a Seguir, para utilizar SQL TRACE y TKPROF:
1. Habilitar el SQL TRACE, para instancias o sesiones 2. Localizar los archivos de rastreo de inters 3. Usar el TKPROF para formatear 4. Interpretar los resultados

5. Optimizar la consulta y repetir el proceso si es necesario

A continuacin se explica en detalle cada uno de los pasos que componen este proceso:

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 1. Habilitar el SQL TRACE, para instancias o sesiones

Para Habilitar el rastreo de las sentencias de inters, se ejecuta el siguiente comando desde SQLPLUS: ALTER SESSION SET SQL_TRACE = TRUE;
Para activarlo desde PL/SQL, se debe utilizar:

DBMS_SESSION.SET_SQL_TRACE(TRUE);

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 2. Localizar los archivos de rastreo de inters
Teniendo ya habilitado el SQL TRACE, el siguiente paso es la bsqueda del archivo generado por el mismo.
Estos archivos de rastreo (.trc) son guardados generalmente en la ruta que tiene por defecto el parmetro de configuracin: user_dump_dest El nombre de los archivos generados por la herramienta, posee la siguiente sintaxis: header_pid.trc Donde header es generalmente ORA, Oracle_SID_ORA u SID_ORA y el PID es el identificador que Oracle asigna a este proceso.

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 2. Localizar los archivos de rastreo de inters (cont.)

Para hallar la ruta donde se encuentran los archivos de rastreo, se puede ejecutar la siguiente consulta: SELECT value FROM v$parameter WHERE name = 'user_dump_dest';

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 2. Localizar los archivos de rastreo de inters (cont.)
Para encontrar un archivo de rastreo especfico, es necesario conocer cual fue el PID que Oracle asign a este proceso. Esto se puede averiguar mediante la siguiente consulta: SELECT spid FROM sys.v_$process WHERE addr = ( SELECT paddr FROM sys.v_$session WHERE audsid = userenv('sessionid') ); Sin embargo, si se quiere personalizar el directorio donde se guardarn los archivos de rastreo, se puede hacer lo siguiente: ALTER SYSTEM SET user_dump_dest = 'ruta_de_directorio';

Nota: el cambio de este parmetro debe realizarse antes de habilitar el rastreo de sentencias.

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 3. Usar el TKPROF para formatear

Una vez se encuentra el archivo de rastreo requerido, se utiliza la herramienta TKPROF para transformarlo en una forma interpretable. La sintaxis es:
tkprof trace_file output_file [explain=username/password] sort(sort options)]

TKPROF, se ejecuta por fuera del entorno de SQLPLUS, es decir, en una lnea de comandos del sistema operativo. A continuacin se muestran las diferentes opciones de los parmetros de configuracin.

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 3. Usar el TKPROF para formatear
trace_file Es el nombre del archivo generado por SQL_TRACE Es el nombre del archivo en el cual quedar la informacin relevante

Output_file

explain=username/passwor Especifica la conexin, la cual ser d utilizada para generar los planes de ejecucin SQL. Sort=(sort keys) Muestra las sentencias SQL en valores descendientes de acuerdo a las claves de ordenamiento elegidas, estas son parsing (prc), ejecucin (.exe), recuperacin (fch).

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 3. Usar el TKPROF para formatear

Funciones del ordenamiento del TKPROF: Cada clave de ordenamiento, se compone de 2 partes, la primera indica el tipo de llamada y la segunda parte, los valores a ser ordenados.
A continuacin se presenta una tabla completa acerca de las opciones de ordenamiento del TKPROF.

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 3. Usar el TKPROF para formatear
prs exe Ordena sobre valores en el momento de parsing. Ordena sobre valores durante llamadas de ejecucin Ordena sobre valores durante llamadas a fetch. cnt cpu Ordena sobre el nmero de llamadas Ordena por el consumo de CPU.

fch

ela

Ordena sobre tiempo transcurrido

dsk
qry cu mis

Ordena sobre lecturas de disco


Ordena sobre lecturas consistentes. Ordena sobre lecturas actuales Ordenamiento sobre fallos en la cache de la biblioteca., aplica solo a parsing y ejecucin. Ordena sobre filas procesadas. Aplica solo a exe y fch.

row

Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 3. Usar el TKPROF para formatear

Ejemplo: Exedsk: Indica que las sentencias son ordenadas en el archivo de salida de acuerdo a las lecturas de disco durante la ejecucin.

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 4. Interpretacin los resultados.

Estadsticas tabuladas: TKPROF lista las estadsticas en filas y columnas para una sentencia SQL. Cada fila corresponde a uno de los 3 pasos del procesamiento del SQL:
PARSE: Este paso traduce la sentencia SQL en un plan de ejecucin, chequeo de existencia de objetos, permisos etc. EXECUTE: Este paso es la ejecucin real de la sentencia. Para las sentencias INSERT, UPDATE, y DELETE, este paso modifica los datos. Para las sentencias SELECT, el paso identifica las filas seleccionadas. FETCH: Este paso trae las filas retornadas por una consulta. Estos fetches solo se realizan para sentencias SELECT

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 4. Interpretacin los resultados.

Las otras columnas de la herramienta TKPROF son estadsticas combinadas de todos los parsings, ejecuciones y fetches de una sentencia. La suma de las columnas de los totales de query y current es el nmero total de bloques ledos.
A continuacin se presenta el significado de las columnas.

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 4. Interpretacin los resultados.
COUNT: Nmero de veces que a una sentencia se le realiz parsing, ejecucin o fetching. CPU: Tiempo total de CPU en segundos para las llamadas de parsing, ejecucin y fetch. ELAPSED: Tiempo total transcurrido para todas las llamadas de parsing, fetch y ejecuciones de la sentencia. DISK: Nmero total de Bloques de datos ledos fsicamente de los archivos de datos en el disco para las llamadas de parsing, ejecucin y fetch. QUERY: Nmero total de buffers trados en modo consistente para todas las llamadas de parsing, fetch y ejecuciones de la sentencia. (los buffers se traen en modo consistente para las consultas).

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 4. Interpretacin los resultados.
CURRENT: Nmero total de buffers trados en modo current para todas las llamadas de parsing, fetch y ejecuciones de las sentencias que implican modificacines sobre tablas (UPDATE, DELETE, e INSERT).

Rows: Las estadsticas acerca de las filas procesadas, aparecen en esta columna. El nmero total no incluye las filas procesadas por las subconsultas de la sentencia SQL. Para las sentencias SELECT, el nmero de filas retornadas aparece para cada uno de los pasos de fetch. Para las sentencias UPDATE, DELETE, e INSERT, el nmero de filas procesadas aparece por cada paso de ejecucin.

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 4. Interpretacin los resultados.

Los Resultados del TKPROF, se encuentran tabulados y cada valor, como se vio, tiene su propio significado.
Observemos detenidamente la salida del TKPROF, y a travs de este, se podr decidir acerca de la eficiencia de una consulta SQL especfica. Esto lo se har observando algunas tasas puntuales derivadas de esta salida.

Observemos con detenimiento los elementos de la salida del TKPROF

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 4. Interpretacin los resultados.
call count cpu elapsed disk query current rows --------- ------- ------ ------- ------ ------ -------- -----Parse(a) (d) ------Execute(b) (e) ------Fetch(c) (j) -----(i) --------- ------- ------ ------- ------ ------ -------- -----Total ----(k) (f) (g) (h)

Luego de observar los elementos importantes en la salida del TKPROF, se pasa a analizar las tasas que ayudarn a determinar, que consultas SQL necesitan ser optimizadas.

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF 4. Interpretacin los resultados.

Tasas de Importancia
1. Bloques ledos (f+g) a filas procesadas (h). Esto indica de una manera general, el costo relativo de la consulta. Mientras ms bloques tienen que ser accedidos en relacin a las filas retornadas, la fila trada ser mucho ms costosa. Una relacin similar se puede deducir sobre la tasa de bloques ledos sobre ejecuciones (f+g)/e.

Tasas por encima de 10 o 20, pueden indicar alguna posibilidad de optimizacin en este campo.

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF (Interpretacin los resultados) Tasas de Importancia 2. Parsing (d), sobre ejecucin (e). Idealmente, el conteo de parsing debe ser cercano a uno. Si este valor es alto en relacin al conteo de ejecuciones, la sentencia entonces ha sido parseada varias veces sin necesidad. 3. Filas traidas (i) sobre traidas (j) (Rows Fetched over fetches). Esto indica el nivel en el cual, la capacidad del array fetch ha sido utilizada. Una tasa cercana a uno, indica que no hubo procesamiento a travs de arrays, lo que significa que existe una buena oportunidad para optimizar.

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF (Interpretacin los resultados) Tasas de Importancia 4. Lecturas de Disco (k) a lecturas lgicas. (f+g). Esto es una medida de la tasa de error (miss rate) dentro del buffer de datos en la cache. Generalmente se busca que esta tasa no represente ms de un 10% Ahora se observar un ejemplo especfico que mostrar como se puede utilizar el TKPROF como herramienta eficaz de anlisis y optimizacin.

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF (Interpretacin los resultados)

Supongamos que se tiene la siguiente consulta SQL:


SELECT FROM WHERE e.apellido, e.nombre, e.fecha_nacimiento empleados e EXISTS (SELECT cod FROM clientes c WHERE e.apellido = apellido_contacto AND e.nombre = c.apellido_nombre AND e.fecha_nacimiento = c.fecha_nacimiento) ORDER BY e.apellido, e.nombre;

Ahora observemos cual es la salida respectiva del TKPROF

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF (Interpretacin los resultados)
call --------Parse Execute Fetch --------Total count cpu elapsed ------- ------ ------1 0 0.43 1 0 0.00 11 0 323.74 ------- ------ ------13 0 324.17 disk query current rows ------ ------ -------- -----0 0 0 0 0 0 0 0 204161 212083 2400 151 ------ ------ -------- -----204161 212083 2400 151 0

Misses in library cache during parse: Optimizer Hint: RULE Rows ------0 800 800 801 4109475

Execution Plan --------------------------------------------SELECT STATEMENT FILTER TABLE ACCESS (BY ROWID) OF 'EMPLEADOS INDEX (RANGE SCAN) OF 'INDICE_EMPLEADOS_NOMAP' TABLE ACCESS FULL OF 'CLIENTES'

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF (Interpretacin los resultados) Observemos ahora, las tasas analizadas anteriormente para saber si existe campo para optimizar.
TASA V. NORMAL V. ENCONTRADO

(f+g) / h d/e i/j k / (f+g)

Entre 10 y 20 1 (o cerca de 1)
Mientras mayor valor, mejor

1420 aprox. 1 13.73 95

Menos de 10

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF (Interpretacin los resultados)

Cuando se observa la salida del TKPROF, de manera general, se debe considerar:


- Cun eficiente es la sentencia? (indicado por tradas de bloque por filas retornadas -- (f + g) / h ). - Cmo se trajeron los datos? En otras palabras, qu significa el plan de ejecucin? - En qu pasos del plan de ejecucin se procesaron la mayor cantidad de filas? cmo se pueden evitar estos pasos?

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF (Interpretacin los resultados)

Observando las tasas, y el EXPLAIN PLAN de la consulta presentada se tiene que:


- La eficiencia de la consulta es bastante pobre. - Se procesaron ms de 4 millones de filas en el FULL TABLE SCAN de la tabla clientes. (en el ejemplo, esta tabla solo tiene 5150 filas), por lo que nos indica que este SCAN ha ocurrido ms de una vez. Observando el EXPLAIN PLAN nos damos cuenta que por cada fila en empleados se realiz el SCAN: (800 * 5150 = 4.12 millones).

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF (Interpretacin los resultados) Para corregir esto, se podra utilizar un ndice en esta tabla, o redefinir la consulta de manera que sea ms eficiente. Se opta por redefinir la consulta as:
SELECT FROM WHERE AND AND ORDER BY e.apellido, e.nombre, e.fecha_nacimiento empleados e, clientes c e.apellido = apellido_contacto e.nombre = c.apellido_nombre e.fecha_nacimiento = c.fecha_nacimiento e.apellido, e.nombre;

Se ha utilizado un JOIN, que es ms eficiente que el EXISTS, observemos ahora la salida del TKPROF

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF (Interpretacin los resultados)
call --------Parse Execute Fetch --------Total count cpu elapsed disk query current rows ------- ------ ------- ------ ------ -------- -----1 0 0.12 0 0 0 0 2 0 0.96 0 0 1 0 11 0 9.82 278 364 370 151 ------- ------ ------- ------ ------ -------- -----14 0 10.9 278 364 371 151 0

Misses in library cache during parse: Optimizer Hint: RULE Rows -----0 151 151 5151 5151 800 800

Execution Plan --------------------------------------------SELECT STATEMENT SORT (ORDER BY) MERGE JOIN SORT (JOIN) TABLE ACCESS FULL OF 'CLIENTES' SORT (JOIN) TABLE ACCESS FULL OF 'EMPLEADOS'

SQL TRACE Y TKPROF


Pasos a Seguir, a la hora de utilizar SQL TRACE y TKPROF (Interpretacin los resultados) Si se observa detenidamente los resultados, ahora solo se hace un TABLE SCAN por cada tabla y la tasa de bloques a fila ( (f + g ) / h) ha bajado a 4.8 (antes 1420). Aunque la tasa de lecturas de disco a lecturas lgicas (k / ( f + g )) tambin redujo su valor, se muestra que aun hay espacio para mejorarla. Es obvio que este ejemplo se defini para que los resultados de las salidas fueran bastante visibles y se observara detenidamente el proceso de optimizacin

SQL TRACE Y TKPROF


Otra forma de obtener el EXPLAIN PLAN y un reporte alternativo de estadsticas al ya presentado, es mediante el uso en SQL*Plus del comando:
SET AUTOTRACE ON

Supongamos la consulta:
SELECT * FROM emp;

La salida que se muestra en SQL*Plus es:

Execution Plan ---------------------------------------------------------0 SELECT STATEMENT Optimizer=ALL_ROWS (Cost=3 Card=4 Bytes=80) 1 0 TABLE ACCESS (FULL) OF 'EMP' (TABLE) (Cost=3 Card=4 Bytes=80) Statistics ---------------------------------------------------------0 recursive calls 0 db block gets 8 consistent gets 0 physical reads 0 redo size 656 bytes sent via SQL*Net to client 496 bytes received via SQL*Net from client 2 SQL*Net roundtrips to/from client 0 sorts (memory) 0 sorts (disk) 4 rows processed

You might also like