Вы находитесь на странице: 1из 29

Introducción

al optimizador
Introducción al Optimizador.

• El optimizador de consultas SQL es el responsable de generar el


plan de ejecución más rápido para cada sentencia SQL.

• Este proceso incluye la selección de rutas de acceso a tablas, la


ordenación de uniones si hay más de una tabla implicada en la
consulta, así como los métodos de unión entre esas tablas.

• Actualmente, el optimizador usado es CBO, basado en costes para


elegir entre las distintas rutas de acceso, orden de unión de tablas y
métodos de unión alternativos.
Introducción al Optimizador.

• Las sentencias SQL, una vez que han sido analizadas, son
almacenadas en un área de memoria llamada Library Cache, dentro
de la Shared Pool.

• Esta zona utiliza un algoritmo LRU (Ultimo usado recientemente)


para su balance de carga en la memoria.

• El objetivo a cumplir es la posibilidad de mantener todas las


sentencias en memoria.

• El camino más rápido para examinar los contenidos de la Shared


Pool es la vista V$SGASTAT
Introducción al Optimizador.
Introducción al Optimizador.

• Cuando se ejecuta una sentencia SQL o PL/SQL, varias


operaciones se han de realizar para su ejecución.

1. Oracle convierte la sentencia en un conjunto de códigos ASCII.


2. El conjunto de número se pasa por una función HASH que devuelve
un valor único F(x)
3. Se chequea si ese valor existe en la Shared Pool.

3.1 Si Existe se usan los datos almacenados en memoria


3.2 Si No Existen fase de parsing:
(Chequeo Sintaxis, Obtención Objetos y estructuras, búsqueda DD,
Selección plan ejecución, Seguridad, generación)
Introducción al Optimizador.

PARSING
• Es la operación de gestión y tratamiento de sentencias introducidas por
los clientes.
• Existen 2 fases en el PARSING: Hard Parsing y Soft Parsing

 SOFT Parsing
– Es realizado cuando la sentencia existe en memoria
– Realiza la comparación y el análisis sintáctico.
– Consulta el plan de ejecución y ejecuta la consulta.
 HARD Parsing
– Es realizado cuando la sentencia NO existe en memoria
– Realiza la comparación, análisis sintáctico y semántico
– Reserva memoria para la consulta.
– Revisa permisos de usuarios y privilegios
– Genera el plan de ejecución y ejecuta la consulta.
Optimizador de Oracle

• Para ejecutar una consulta, Oracle debe realizar lo que se conoce


como "plan de ejecución".

• Oracle cuenta un optimizador obtener estos planes:


• Optimizador basado en costos (CBO - Cost Based Optimizer)

• El optimizador puede ser elegido a conveniencia del DBA a nivel de:


 Fichero de Parámetros (OPTIMIZER_MODE)
 Sesión (Alter session set optimizer_mode = opcion)
 Consulta individual (HINTS)
Optimizador de Oracle

• OPTIMIZER_MODE = Valor
ALL_ROWS Uso de CBO para todos los comandos SQL
Busca el mejor Rendimiento con el mínimo número de
recursos.
Valor por defecto en Oracle 11g

FIRST_ROWS_n Uso de CBO con independencia de estadísticas.


Objetivo menor tiempo de respuesta
N = 1, 10, 100, 1000

FIRST_ROWS Combinación de CBO y heurística (RBO) para la


entrega de las primeras filas.
Puede generar planes mas largos y complejos

CHOOSE Obsoleto. Se elige ALL_ROWS


RULE Obsoleto. Se elige ALL_ROWS ( metalink 189702.1)
Optimizador de Oracle

• Sesión
Alter session set OPTIMIZER_MODE = FIRST_ROWS_10

• Hint INSTANCIA
Select /*+ FIRST_ROWS(10) */ * SESION
from emp;
HINT

NOTA:
Si el optimizador usa CBO con estadísticas y alguna tabla no dispone de esas
estadísticas, Oracle se basa en información interna (n.bloques datos, n.bloques libres,
ocupados, etc ) para realizarlo
Optimizador de Oracle

Heurística
Optimizador de Oracle

• Las estadísticas usadas por el optimizador se guardan en el


Diccionario de Datos (recogidas mediante el DBMS_STATS) y en el AWR.

• Disponemos de un parámetro OPTIMIZER_FEATURES_ENABLE,


para indicar la compatibilidad del optimizador y su funcionamiento.

• Es usado para habilitar una serie de optimizaciones dependientes de la


versión de Oracle a usar.

OPTIMIZER_FEATURES_ENABLE= [ 8.0.4 | 8.1.7 | 9.2.0 | 10.0.0 …..]

• Sino indicamos nada, se toma el valor correspondiente a la versión


actual de Oracle.
Optimizador de Oracle. CBO

OPTIMIZADOR BASADO EN COSTOS (CBO)

• Determina cual plan de ejecución es el más eficiente considerando las


caminos disponibles para ello.

• Se basa en la recolección de información (estadísticas) de tablas e índices.

• Permite la utilización de HINT’s para la optimización concreta de una


consulta en particular

• Las estadísticas se obtienen mediante el comando paquete DBMS_STATS


o basándose en el AWR.
Optimizador de Oracle. CBO

OPTIMIZADOR BASADO EN COSTOS (CBO)

• En Oracle 11g, el CBO tiene 2 modos


• NORMAL:
 Es el usado habitualmente en operaciones de SQL.
 Opera desde dentro de una restricción de tiempo estimado.

• TUNING:
 Es el modo usado por los asesores de TUNING y ACCESO.
 Es usado para realizar un análisis completo en consultas más complejas
 Consume más tiempo que el modo normal, debido a su mayor información y caminos
usados para la obtención del Plan de Ejecución Idóneo.
Optimizador de Oracle. CBO

NORMAL TUNING

Tiempo empleado < 1 seg Realiza un análisis adicional en el plan de


Ejecución producido por el modo normal.
Produce exclusivamente Planes de Produce Planes de Ejecución y
Ejecución Recomendaciones
Utiliza el Perfil de SQL Existente en ese Si lo cree conveniente, genera un SQL
momento. Profile como parte de las recomendaciones.
Si aceptamos la recomendación de la
creación del Perfil, éste se guardará en el
DD para ser usado de forma normal.
Optimizador de Oracle. CBO

CBO. Diferencias 9i y 10g-11g


• El modelo de COSTOS ha cambiado entre las versiones 9i y 10g

Oracle 9i
• Usa un modelo de Costos basado en el I/O, evaluando todo, principalmente, en
términos de lectura de bloques.
• No utiliza el uso de los gastos de CPU ( o usando constantes para ello).

Oracle 10g-11g
• El modelo de Costos incluye estadísticas del Sistema de manera realista
captando CPU + I/O.
• Se amplia el número de algoritmos para el proceso de transformación y creación
de QUERY BLOCK’s.
Optimizador de Oracle. CBO

OPTIMIZADOR BASADO EN COSTOS. COMPONENTE

• El optimizador determina qué plan de ejecución es el más eficiente


en una serie de pasos:
• Creación de QUERY BLOCK.
• Estimación de Costos.
• Creación de planes de ejecución.

• El CBO está compuesto por 3 componente:


 QUERY TRANSFORMER
 ESTIMATOR
 PLAN GENERATOR
Optimizador de Oracle. CBO
Optimizador de Oracle. CBO

CBO. Motor de Transformación


• Después del análisis sintáctico, una select es descompuesta en un conjunto
de QUERY BLOCK que son enviados al optimizador (Motor de Trasformación).

• Determina si es ventajoso cambiar la forma de consulta para permitir una


mejor generación del plan.

• A los Query block recibidos, se le aplican unos algoritmos basados en


REGLAS para ser transformados.
• Select-Join
• Group By
• Distinct – View
• Reesecritura de Vistas Materializadas.
Optimizador de Oracle. CBO

CBO. Motor de Transformación . Ejemplos

Si una consulta contiene una


cláusula WHERE con varias
condiciones con OR, el
optimizador la transforma en una
consulta compuesta equivalente a
usar UNION ALL
Optimizador de Oracle. CBO

CBO. Motor de Transformación . Ejemplos

Anulación de Subconsulta
-----------------------------------

El optimizador transforma una


consulta anidada en
una sentencia de JOIN.

Esta transformación
permite al optimizador elegir
ruta de acceso, el método
de unión y el orden de
unión.
Optimizador de Oracle. CBO

CBO. Motor de Transformación . Ejemplos

Fusión de Vistas
-----------------------------------

Esta optimización se aplica a


vistas que contengan sólo
selecciones, proyecciones y
uniones.

Vistas que no contengan


- funciones agregadas,
- -DISTINCT, GROUP BY,
CONNECT BY, etc.
Optimizador de Oracle. CBO
CBO. Motor de Transformación
• Las siguientes HINTS indican al optimizador que utilice o no una
transformación de consulta específica:
• NO_QUERY_TRANSFORMATION
• USE_CONCAT
• NO_EXPAND
• REWRITE y NO_REWRITE
• MERGE y NO_MERGE
• STAR_TRANSFORMATION y NO_STAR_TRANSFORMATION
• FACT y NO_FACT
• UNNEST y NO_UNNEST
Optimizador de Oracle. CBO

CBO. Estimador
• Se estima el tiempo de ejecución basándose en:
• Cardinalidad ( número de filas )
• Selectividad ( fracciones de las filas filtradas por un predicado WHERE )
• Recursos usados ( I/O, CPU, memoria)
• Número de operaciones de I/O
• Tipo de operaciones de I/O
• Número de ciclos de CPU para su ejecución.

• La exactitud de estas operaciones depende de las estadísticas (objeto +


estadísticas de Sistema + Profile de SQL Existentes).
Optimizador de Oracle. CBO

CBO. Estimador.

Selectividad y Cardinalidad

• La selectividad afecta a las estimaciones del costo de E/S y al costo de la


ordenación.

• La cardinalidad es importante para determinar uniones, filtros y costos de


ordenación.

• Si se utiliza una selectividad y una cardinalidad incorrectas, el optimizador estima


el costo del plan incorrectamente.
Optimizador de Oracle. CBO

CBO. Estimador.

Costo
• Valor estimado proporcional entre recursos necesitados, modos de acceso, joins, orden de
los joins, I/O, etc

• El costo es la mejor estimación del optimizador del número de E/S necesarias para ejecutar
una sentencia concreta.

• La fórmula de costo combina tres unidades de costo diferentes en unidades de costo


estándar
Optimizador de Oracle. CBO

CBO. Generador de Planes


• Reescriben las QUERYS en varios modos, construyendo planes alternativos, usando
diferentes métodos JOIN, SORT etc para su ejecución.

• El optimizador genera un conjunto de planes potenciales para la sentencia SQL


basado en access path, HINTS.

• En SELECT con más de una Tabla, más tiempo se tarda en generar los posibles
planes de ejecución.

• Se escoge el mejor plan ( Menor COSTO estimado). ¿Cómo se mide eso?


• El Costo está influenciado por muchos factores e incluso parámetros de la Base de datos
(V$SYS_OPTIMIZER_ENV)
Control del Comportamiento del Optimizador

• Existen bastantes parámetros que controlan el comportamiento del


Optimizador.

• Estos parámetros suelen ser modificados por usuarios con


privilegios administrativos (Alter system set …) y otros el propio
usuario (Alter session set … )

• Algunos parámetros habituales de cambio son:


• CURSOR_SHARING: EXACT, FORCE
• PGA_AGGREGATE_TARGET
• RESULT_CACHE_MODE: MANUAL, FORCE
• OPTIMIZER_INDEX_CACHING
• OPTIMIZER_INDEX_COST_ADJ
• OPTIMIZER_MODE: ALL_ROWS, FIRST_ROWS, FIRST_ROWS_n
Control del Comportamiento del Optimizador
Práctica 6: Visión General

Visión General de las Prácticas


• En estas prácticas, creará un archivo de rastreo 10053 de evento y revisará
las secciones para
• reconocer los contenidos del archivo. También abrirá y analizará un archivo de
rastreo SQL con
• SQL Developer. Es una práctica opcional.
• Nota: esta práctica se proporciona sólo con fines de demostración. No la
utilice en el sistema
• de producción a menos que los Servicios de Soporte Oracle se lo indiquen
específicamente.