martes, 10 de abril de 2018

Entendiendo EXPLAIN PLAN de Oracle


Dado que SQL es un lenguaje declarativo, nosotros no le decimos como hacer las cosas, solo le decimos que hacer. Por lo tanto el motor de base de datos, decide que camino tomar.

Si tenemos un problema de performace en alguna consulta, lo que podemos hacer es pedirle a oracle que nos explique que esta haciendo, y de esta manera ver si le falta un indice o si la podemos ayudar.

La instrucción EXPLAIN PLAN muestra los planes de ejecución elegidos por el optimizador de Oracle para las instrucciones SELECT, UPDATE, INSERT y DELETE. El plan de ejecución de una declaración es la secuencia de operaciones que Oracle realiza para ejecutar la instrucción.

Muestra la siguiente información:
  • Un orden de las tablas a las que hace referencia la consulta o update
  • Un método de acceso para cada tabla mencionada en la consulta o update
  • Un método de combinación para tablas afectadas por operaciones de combinación de la instrucción.
  • Operaciones de datos como filtro, clasificación o agregación
Además la tabla de plan contiene información sobre lo siguiente:
  • Optimización, como el costo y la cardinalidad de cada operación
  • Particionamiento, como el conjunto de particiones accedidas
  • Ejecución paralela
Los resultados de EXPLAIN PLAN le permiten determinar si el optimizador selecciona un plan de ejecución particular, como por ejemplo, bucles anidados. También nos ayuda a comprender las decisiones del optimizador, como por qué el optimizador eligió una unión de bucles anidados en lugar de una combinación de hash, y le permite comprender el rendimiento de una consulta.

Para ejecutar el EXPLAIN PLAN debemos ejecutar por ejemplo esta query:

EXPLAIN PLAN FOR
  SELECT last_name FROM employees;
En este caso se escribio el plan de ejecución en una vista por lo que si queremos verlo, podemos hacer: 

SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
Luego podemos escribir otros post que nos enseñen como entender los query plans. Pero eso es todo por ahora.