Professional Documents
Culture Documents
2
¿Qué es el Optimizador? .............................................................................. ................2
Planes de ejecución ............................................................................................... .......3
Etapas del Plan de Ejecución .............................................................. .........................3
El comando EXPLAIN PLAN.......................................................... ...............................3
Tipos de Optimización ................................................................... ...............................3
Operaciones del optimizador................................................................................... ..........4
Evaluación de Expresiones, Condiciones y Constantes ...............................................4
Transformación de sentencias .................................................................... ..................5
Métodos de combinación de tablas ........................................................................... ....6
Optimización de Sentencias en 'Estrella' ........................................... ...........................7
Cómo especificar el tipo de optimización .......................................................................... 7
Optimización basada en costes................................................................................... ......8
Objetivo de la estimación basada en costes.................................................. ................8
Estadísticas para la estimación basada en Costes .......................................................... .9
Características disponibles con la Optimización Basada en Costes.......................... ......10
Recogida de estadísticas..................................................................... ...........................10
Comando ANALYZE .............................................................................................. ......11
Paquete DBMS_STATS ................................................................. .............................11
Histogramas .............................................................................................................. ..12
Caminos de acceso a los datos................................................................................. ......13
Plan de ejecución............................................................................................ ................14
Definición de la tabla PLAN_TABLE.................................................. ..........................15
Operaciones y Opciones de la tabla PLAN_TABLE.................................... .................15
Comando EXPLAIN PLAN .............................................................................. ............17
Optimización basada en Reglas......................................................................... .............18
Introducción a la Optimización de Reglas..................................................... ...............18
Caminos de acceso a los datos............................................................... ....................18
Ajuste de Sentencias SQL. Traza SQL y utilidad TKPROF ............................................ .19
Activar los Parámetros de Inicialización............................................................... ........19
Activar la traza............................................................................................. ................20
Formateo de la traza con TKPROF....................................................................... .......20
Interpretar el fichero de salida..................................................................................... .21
Estadísticas Tabulares................................................................................ .................21
Almacenar estadísticas en la Base de Datos.................................................... ...........22
La característica AUTOTRACE de SQL*PLUS ........................................................ .......23
Ajuste manual de sentencias: Los HINTS ............................................ ..........................23
Propósito de los Hints.................................................................................... ..............23
Comentarios para decidir el método de Optimización........................................ ..........24
Comentarios para decidir el método de Acceso............................................... ............24
Comentarios para decidir el orden de combinación................................ .....................24
Comentarios para decidir el método de combinación...................... ............................25
Comentarios para ejecución en paralelo.............................................................. ........25
Comentarios adicionales.......................................................................................... ....25
Vistas Materializadas .................................................................................................... ..25
Introducción............................................................................................. ....................25
Creación de vistas materializadas.................................................. .............................26
Refresco de vistas materializadas.................................................. .............................26
Reescritura de Consultas......................................................................................... ....26
Estabilidad de Planes.......................................................................................... ............28
Creación de Outlines para Estabilidad de Planes.................................... ....................28
Uso de Outlines con la Optimización basada en Costes........................................ ......29
¿Qué es el Optimizador?
Para cada instrucción SQL ejecutada por Oracle, el optimizador puede realizar
varias de las siguientes tareas :
Planes de ejecución
Para ejecutar una sentencia SQL, Oracle puede necesitar muchos pasos. En cada
uno de estos pasos, o bien se recuperan registros de datos de la base de datos, o bien se
prepara a aquélla de alguna manera para que el usuario obtenga la salida de su
instrucción. La combinación de pasos que Oracle usa para ejecutar una instrucción es lo
que se denomina Plan de Ejecución. Un plan de Ejecución incluye:
Cada etapa del Plan de ejecución devuelve un grupo de registros que o bien son
usados por el siguiente paso, o en él ultimo paso, son devueltos al usuario o aplicación
liberando la instrucción SQL. El grupo de registros devueltos por un paso es conocido
como row set, o conjunto de registros. El origen de estos registros puede ser, o bien, la
recuperación desde un determinado objeto de la base de datos, o bien la combinación de
los row sets obtenidos de los pasos anteriores en el plan de ejecución.
Tipos de Optimización
Transformación de sentencias
Los joins son sentencias que devuelven datos de más de una tabla (o de una única
tabla referenciada varias veces). Un join esta caracterizado por múltiples tablas en la
cláusula FROM y la relación entre estas tablas es definida a través de la condición
WHERE. El optimizador cuenta con varios métodos para realizar combinaciones entre
tablas, y debe elegir entre ellos el más eficiente. Entre los principales métodos de join
están :
• Bucles Anidados (Nested Loop Joins) : el optimizador utiliza este método con
conjuntos de datos pequeños, y en el caso de que la condición de join sea un
camino de acceso eficiente para la tabla “interior”. El optimizador determina cuál
es la tabla “conductora”, y ejecuta un bucle accediendo a los registros de esta
tabla que cumplan las condiciones de la consulta. Para cada registro de la tabla
conductora, se ejecuta un bucle accediendo a la tabla interior, mediante los
valores actuales de la tabla conductora. Por tanto, es importante que el camino
de acceso a la tabla interior sea muy eficiente.
Algunos data warehouse son diseñados como esquemas en estrella, lo que incluye
una gran tabla de hechos y varias pequeñas tablas de dimensiones. En la primera se
almacena información básica y en las demás se guarda información de atributos de la tabla
de hechos.
Una consulta en estrella es una unión entre una tabla de hechos y un cierto número
de tablas de dimensiones, unidas por relaciones clave primaria – clave ajena, y sin relación
entre las tablas de dimensiones. El Optimizador Basado en Costes es capaz de identificar
este tipo de relación y de crear un plan de ejecución eficiente. El Optimizador Basado en
Reglas no presenta actividad optimizadora específica en estos casos.
Una típica tabla de hechos contiene claves y medidas. Por ejemplo la medida
Importe de ventas y las claves Fecha, Producto y Mercado (que conectan con las
correspondientes tablas de dimensiones). La tabla de hechos tiene, normalmente, un
indice concatenado en las columnas de la clave para facilitar este tipo de unión o bien
indices independientes para cada columna de la clave.
Para aplicaciones de tipo batch, como Oracle Reports, es preferible optimizar para
la máxima productividad : se disminuye el tiempo total de tarea, no importando
tanto el tiempo de respuesta.
Oracle utiliza diversas técnicas con el fin de obtener las estadísticas para el CBO :
• Para tablas : 100 registros, 100 bloques y 20 bytes de longitud media por
registro.
• Para tablas remotas : 2000 registros y 100 bytes de longitud media por registro.
• Para índices : 25 bloques hoja, un nivel y 100 claves distintas.
• Optimizador extensible
• Combinaciones hash
• Índices bitmap
Recogida de estadísticas
Paquete DBMS_STATS
• DBA_TABLES
• DBA_TAB_COL_STATISTICS
• DBA_INDEXES
• DBA_CLUSTERS
• DBA_TAB_PARTITIONS
• DBA_TAB_SUBPARTITIONS
• DBA_IND_PARTITIONS
• DBA_IND_SUBPARTITIONS
• DBA_PART_COL_STATISTICS
• DBA_SUBPART_COL_STATISTICS
Histogramas
Una de las tareas del CBO es determinar la selectividad de los predicados que
aparecen en las querys. Las estimaciones de selectividad se utilizan para decidir si usar o
no un índice, y el orden en el que combinar tablas. El problema surge cuando los valores
de una columna no están uniformemente distribuidos. En estos casos, es útil guardar
histogramas de la distribución de sus valores.
Para crear histogramas sobre una columna de una tabla, se utiliza el parámetro
METHOD_OPT del procedimiento GATHER_TABLE_STATS del paquete DBMS_STATS :
Para visualizar los histogramas, se cuenta con las siguientes vistas del diccionario :
• DBA_HISTOGRAMS
• DBA_PART_HISTOGRAMS
• DBA_SUBPART_HISTOGRAMS
• DBA_TAB_COL_STATISTICS
- Mediante un acceso completo a la tabla (full table scan), en el que se accede a todos
sus registros. Se realiza una lectura secuencial de los bloques que componen la tabla,
(mejorándose el rendimiento con la lectura simultánea de varios bloques, indicada por
el parámetro de INIT.ORA DB_FILE_MULTIBLOCK_READ_COUNT), descartandose
aquellos que no cumplan los criterios de selección de la clausula WHERE. Este acceso
es utilizado en aquellos casos en que :
- Mediante un acceso por índice (index scan), en el que se usan valores indicados en
la sentencia SQL, para las columnas de la tabla que forman parte del índice. Si una
sentencia utiliza únicamente columnas que forman parte de uno de sus índices, se
utilizan estos valores, no necesitándose el acceso a la tabla mediante ROWID. En caso
contrario, se realiza el acceso mediante ROWID para recuperar los valores del resto de
las columnas. Un acceso mediante índice puede ser :
- Acceso por índice único (index unique scan) : en el que se utilizan valores de
todas las columnas de un índice UNIQUE de la tabla, con condiciones de
igualdad, por lo que se recupera un único registro ( o ninguno ).
- Acceso por rango de índice (index range scan) : en el que se utilizan valores de
algunas o todas las columnas de un índice (UNIQUE ó no) de la tabla, con
condiciones de igualdad o no, por lo que se recupera un número indeterminado
de registros. Normalmente este acceso se realiza en orden ascendente de los
valores de las columnas del índice, a no ser que se solicite mediante la clausula
ORDER BY que se recuperen de forma descendente.
- Acceso rápido al índice completo (fast full index scan) : se da cuando se van a
utilizar únicamente columnas del índice, aunque no se utilicen las primeras. Se
realiza un full scan sobre los bloques del índice, en vez de sobre los bloques
que componen la tabla. En el índice, debe haber alguna columna NOT NULL
(para asegurar que hay un registro en el índice por cada registro de la tabla), y
es conveniente analizar de vez en cuando el índice, para que el optimizador por
costes tenga en cuenta esta posibilidad.
Plan de ejecución
El plan de ejecución es la secuencia de operaciones de base de datos que es
creada por el optimizador a partir de una sentencia SQL, para poder ejecutarla. Es
posible obtener el plan de ejecución de cualquier sentencia SQL, sin tener que
ejecutarla, mediante la sentencia EXPLAIN PLAN. Esta sentencia produce su
resultado en forma de registros insertados en una tabla denominada PLAN_TABLE.
El plan de ejecución para una misma sentencia SQL varía a lo largo del tiempo, en
función del modo de optimización seleccionado, los índices que se añadan o
eliminen, los análisis que se realicen para el optimizador por costes, la cantidad de
datos de las tablas, etc, lo cual dificulta el análisis a priori de las sentencias SQL. La
• TABLE ACCESS : operación de acceso a datos de una tabla. Sus principales opciones
son :
• FILTER : toma un conjunto de registros y devuelve el subconjunto que cumpla con una
serie de restricciones.
• MINUS : toma dos conjuntos de registros y devuelve los registros del primero que no
estén en el segundo, eliminando duplicaciones.
El ranking elaborado por Oracle para los caminos de acceso a los datos es, de
menor a mayor (mejor cuanto más pequeño el ranking) :
La traza de SQL se puede activar para una determinada sesión Oracle, o para la
instancia Oracle al completo. La sobrecarga en el servidor de base de datos es mínima
para una única sesión con la traza activada, pero activar la traza para toda la instancia
puede requerir hasta un 25% del tiempo de CPU, y gran cantidad de espacio en disco para
recoger la salida en bruto de la traza.
El primer paso para utilizar la traza es dar valor a los parámetros correspondientes
de INIT.ORA. Los parámetros principales son :
Activar la traza
BEGIN
DBMS_SESSION.SET_SQL_TRACE( TRUE );
END;
/
A partir del momento en que se activa la traza para una sesión, se va escribiendo
en un fichero correspondiente a ésta toda la información sobre las sentencias que se van
ejecutando, hasta el momento en que finaliza la sesión, o se desactiva la traza con las
sentencias :
BEGIN
DBMS_SESSION.SET_SQL_TRACE( FALSE );
END;
/
Una vez realizada la traza de una sesión, es necesario identificar el fichero de traza
correspondiente, en el directorio de destino de trazas. Suele bastar con mirar la fecha y
hora de los últimos ficheros creados, buscando aquélla que coincida con la fecha y hora de
finalización de la sesión en cuestión. Alternativamente, en caso de múltiples usuarios
realizando trazas simultáneamente, se puede variar el directorio USER_DUMP_DEST a
nivel de sesión.
Donde :
Estadísticas Tabulares
Además, se incluye otra fila con el total combinado de las tres etapas. Las columnas de
cada fila son :
• QUERY : Número total de buffers recuperados en modo consistente para la etapa. Este
modo suele ser utilizado para las consultas.
• CURRENT : Número total de buffers recuperados en modo actual para la etapa. Este
modo suele ser utilizado para las actualizaciones.
SET AUTOTRACE ON
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
1055 consistent gets
0 physical reads
0 redo size
6971 bytes sent via SQL*Net to client
1416 bytes received via SQL*Net from client
11 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
143 rows processed
• /*+ USE_NL(tabla1 tabla2) */ : indica un Nested Loop Join entre las tablas tabla1
y tabla2, con la tabla interior tabla1.
• /*+ USE_MERGE(tabla1 tabla2) */ : indica un Sort Merge Join entre las tablas
tabla1 y tabla2.
• /*+ USE_HASH(tabla1 tabla2) */ : indica un Hash Merge Join entre las tablas.
Comentarios adicionales
Vistas Materializadas
Introducción
Las vistas materializadas son objetos de base de datos que contienen el resultado
de una consulta, que puede hacer referencia a objetos de la misma base de datos, o de
bases de datos remotas. Permiten una mayor eficiencia, al contener el resultado de
El tipo de refresco puede ser FAST (rápido) ó COMPLETE (completo). Para poder
utilizar un refresco rápido, debe existir un registro de vista materializada, definido sobre
la tabla origen de la vista materializada. En consultas complejas, o si no hay definido
registro, puede ser obligatorio el refresco completo.
La fecha de inicio y fecha siguiente son expresiones válidas Oracle que se evalúan
en el momento de la creación, y en sucesivos refrescos, para calcular la próxima fecha en
la que se realizará.
Reescritura de Consultas
Cuando el optimizador analiza una consulta de usuario y encuentra que es
compatible con la consulta asociada a una vista materializada, la consulta del usuario
puede ser reescrita en términos de la vista materializada, para obtener ventaja de ella. Al
hacer esto, se mejora el rendimiento, ya que parte del resultado ya ha sido calculado con
anterioridad. Dependiendo del coste de la reescritura, y de las condiciones adicionales que
haya que aplicar a la vista materializada, se puede optar por la reescritura.