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.
Una vez que se ha determinado el “access path” o ruta de
acceso, éste se almacena en memoria en la “library cache” junto con la sentencia correspondiente. Las
consultas se almacenan en la “library cache” en función de una representación
en hash del literal de la sentencia, este hash luego lo utiliza Oracle para ubicarla en memoria. Antes
de realizar las fases 1-6 antes mencionadas para un SQL determinado, Oracle busca
la sentencia en la “library cache” para ver si ya fue "parseada" y utilizar el
plan ya generado. Primero aplica un algoritmo hash al texto del SQL en cuestión
y luego se busca este valor hash en “library
cache”. Si el hash coincide con alguno
de los almacenados, se utilizará ese “Access path” o método de acceso para
resolver la consulta. Este será siempre utilizado (para la misma consulta) hasta tanto la misma vuelva a parseada. Dependiendo
de las circunstancias, el plan de ejecución tal vez varie de un parseo a otro. (En futuros posteos
veremos que determina que una consulta vuelva a ser parseada).