Professional Documents
Culture Documents
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:
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
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:
Esta herramienta de formateo (proporcionada tambin por Oracle) es conocida como TKPROF
A continuacin se explica en detalle cada uno de los pasos que componen este proceso:
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);
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';
Nota: el cambio de este parmetro debe realizarse antes de habilitar el rastreo de sentencias.
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.
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).
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.
fch
ela
dsk
qry cu mis
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.
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
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.
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.
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.
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.
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.
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'
Entre 10 y 20 1 (o cerca de 1)
Mientras mayor valor, mejor
Menos de 10
Se ha utilizado un JOIN, que es ms eficiente que el EXISTS, observemos ahora la salida del TKPROF
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'
Supongamos la consulta:
SELECT * FROM emp;
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