Está en la página 1de 4

EXPLAIN PLAN

¿Qué es un explain plan?

Un explain plan es una representación de la ruta de acceso que el optimizador de Oracle


Database toma cuando es ejecutada una consulta SQL en la base de datos. El procesamiento de
una consulta SQL se puede dividir en 7 fases:

1- Sintáctica: se verifica la sintaxis de la consulta

2- Semántica: comprueba que todos los objetos existan y sean accesibles

3- View Merging: se reescribe la consulta como join en tablas base en lugar de usar vistas

4- Transformación de sentencias: se reescribe la consulta transformando algunas


construcciones complejas en otras más simples siempre que sea posible (por ejemplo,
subconsulta unnesting, in/or transformation, etc.). Algunas transformaciones usan reglas
mientras que otras tienen un costo basado en estadísticas.

5- Optimización: determina la ruta de acceso óptima para la consulta. El optimizador basado en


costos (CBO) usa estadísticas para analizar los costos relativos de acceso a los objetos.

6- Query Evaluation Plan (QEP): Se evalúan las diferentes opciones de acceso y se genera el
plan.

7- QEP execution: Se llevan adelante la acciones indicadas en el plan de ejecución determinado.

Los pasos del 1 al 6 a veces se agrupan y se denominan 'parsing', fase de 'parseo' o simplemente
análisis.

El paso 7 es la ejecución misma de la sentencia.

El "explain plan" es fundamentalmente una representación de la ruta de acceso generada en el


paso 6.

Crear y guardar un plan de ejecución

Para crear un plan de ejecución, basta con anteponer a la sentencia SQL correspondiente el
comando explain plan for:

EXPLAIN PLAN FOR select * from dual

Se puede ejecutar el comando explain plan for en cualquier ambiente de desarrollo o con
SQL*Plus. Sin embargo, no muestra el plan de ejecución sino que lo guarda en la tabla
denominada PLAN_TABLE. Desde la versión 10g, esta tabla está disponible automáticamente
como una tabla temporal global. Con las versiones anteriores, se tenía que crear en cada
esquema, a medida que se necesitaba. Solicita a tu administrador de base de datos que la cree
o ejecute el comando create table desde la instalación de la base de datos Oracle:
$ORACLE_HOME/rdbms/admin/utlxplan.sql

Se puede ejecutar esta sentencia en cualquier esquema donde se desea crear la


tabla PLAN_TABLE.

Mostrar los planes de ejecución

Introducido a partir de la versión 9iR2, el paquete DBMS_XPLAN permite formatear y mostrar los
planes de ejecución desde la tabla PLAN_TABLE. El siguiente ejemplo muestra cómo se muestra
el último plan de ejecución que se ejecutó en la sesión actual de la base de datos:

select * from table(dbms_xplan.display)

Una vez más, si la sentencia no funciona desde el primer intento, se debe pedir asistencia a su
DBA.

La sentencia mostrará el plan de ejecución como se ha visto en el libro:

--------------------------------------------------------------

| Id | Operation | Name | Rows | Bytes | Cost (%CPU)|.

--------------------------------------------------------------

| 0 | SELECT STATEMENT | | 1 | 2 | 2 (0)|.

| 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)|.

--------------------------------------------------------------

Acceso a tabla e índice

INDEX UNIQUE SCAN


INDEX UNIQUE SCAN realiza solamente el recorrido del B-tree. La base de datos usa esta
operación si una restricción de unicidad asegura que el criterio de búsqueda no pueda
coincidir con más de una entrada.

INDEX RANGE SCAN


INDEX RANGE SCAN realiza el recorrido del B-tree y y sigue la cadena de los nodos hoja
para encontrar todas las entradas que coinciden.

El llamado predicados de filtro sobre índice por lo general causa problemas de


rendimiento para INDEX RANGE SCAN.

INDEX FULL SCAN


Lee el índice entero (todos los registros) en el orden del índice. Dependiendo de varias
estadísticas del sistema, la base de datos podría realizar la operación en el orden del
índice si se necesitan todas las filas gracias a la cláusula order by correspondiente. Por su
parte, el optimizador podría usar también INDEX FAST FULL SCAN y realizar una operación
de ordenamiento adicional.

INDEX FAST FULL SCAN


Lee el índice entero (todos los registros) como se almacenan en el disco. Esta operación
se realiza en lugar de un escaneo entero de la tabla si todas las columnas están
disponibles dentro del índice. De la misma forma que TABLE ACCESS FULL, INDEX FAST
FULL SCAN puede beneficiar de operaciones de lectura multi-bloques.

TABLE ACCESS BY INDEX ROWID


Recupera una fila desde la tabla usando el ROWID recuperado desde la búsqueda
LOOKUP anterior.

TABLE ACCESS FULL


También se denomina escaneo entero de la tabla. Lee la tabla entera (todas las filas y
las columnas) como se almacenan en el disco. Aunque las operaciones de lectura multi-
bloques mejoran de modo considerable la velocidad del escaneo entero de la tabla, es
todavía una de las operaciones más costosas. Junto a la tasa alta de I/O, un escaneo
entero de la tabla debe examinar todas las filas de la tabla así que puede consumir
también una gran cantidad de tiempo CPU.

Uniones (Joins)

Por lo general, las operaciones de unión procesan sólo dos tablas al mismo tiempo. En el caso
de que una sentencia tenga más uniones, éstas se ejecutan de forma secuencial: primero dos
tablas y después el resultado intermedio con la siguiente tabla. Por lo tanto, en el contexto de
las uniones, el término “tabla” puede también significar “resultado intermedio”.

NESTED LOOPS JOIN


Se trata de unir dos tablas yendo a buscar el resultado desde una tabla y seleccionando
la otra tabla por cada fila desde la primera.

HASH JOIN

Carga los registros candidatos desde un lado de la unión dentro de la tabla hash, y
después compara cada fila con el otro lado de la unión.

MERGE JOIN
Merge join combina dos listas ordenadas como si fuera la cremallera de un pantalón.
Ambos lados de la unión deben ser preordenados.

Ordenar y agrupar

SORT ORDER BY
Ordena el resultado de acuerdo a la cláusula order by. Esta operación necesita una
cantidad importante de memoria para materializar el resultado intermedio (sin
pipeline).

SORT ORDER BY STOPKEY


Ordena un subconjunto del resultado de acuerdo con la cláusula order by, usado por las
sentencias top-N si la ejecución en pipeline no es posible.

SORT GROUP BY
Ordena el resultado configurado sobre las columnas del group by y combina el resultado
ordenado en la segunda etapa. Esta operación necesita una cantidad importante de
memoria para materializar el conjunto del resultado intermedio (sin pipeline).

SORT GROUP BY NOSORT


Agrega un conjunto preordenado de acuerdo con la cláusula group by. Esta operación no
pone el resultado intermedio en memoria: se ejecuta de manera pipeline.

HASH GROUP BY
Agrupa el resultado usando la tabla hash. Esta operación necesita una cantidad de
memoria importante para materializar el conjunto del resultado intermedio (sin
pipeline). La salida no está ordenada de manera determinista.

Sentencias Top-N

La eficiencia de las sentencias top-N depende del modo de ejecución de las operaciones
subyacentes. Son muy ineficientes cuando se abortan las operaciones sin pipeline como SORT
ORDER BY.

COUNT STOPKEY
Aborta las operaciones subyacentes cuando se alcanza el número deseado de filas.

WINDOW NOSORT STOPKEY


Usa una función de ventana (cláusula over) para abortar la ejecución cuando se alcanza
el número deseado de filas.

EXERCICI
Crea la taula següent on tinguis les taules depart i emple.

CREATE TABLE PROJ (PROJ_NO NUMBER(5), PROJ_DESC VARCHAR2(50), EMP_NO


NUMBER(4));
ALTER TABLE PROJ ADD ( CONSTRAINT FK_PROJ_EMP FOREIGN KEY (EMP_NO)
REFERENCES EMPLE (EMP_NO));
INSERT INTO PROJ VALUES (1,'PROJECTE 1',7369);
INSERT INTO PROJ VALUES (2,'PROJECTE 2',7521);
INSERT INTO PROJ VALUES (3,'PROJECTE 3',7566);
INSERT INTO PROJ VALUES (4,'PROJECTE 4',7900);
INSERT INTO PROJ VALUES (5,'PROJECTE 5',7844);
INSERT INTO PROJ VALUES (6,'PROJECTE 6',7876);
INSERT INTO PROJ VALUES (7,'PROJECTE 7',7900);
INSERT INTO PROJ VALUES (8,'PROJECTE 8', 7900);

Executa el explain plan d’aquesta query dins el TOAD mateix

SELECT E.APELLIDO,E.OFICIO,E.SALARIO,D.DNOMBRE
FROM EMPLE E, DEPART D
WHERE D.DEPT_NO=E.DEPT_NO AND NOT EXISTS (SELECT * FROM PROJ P WHERE E.EMP_NO
= P.EMP_NO);
Visualitza el resultat a la pestanya del explain plan i intenta explicar que está passant.

También podría gustarte