Está en la página 1de 19

Sesin 6

Optimizacin de
Consultas
Prof. Guillermo Johnson
j @ li d joromerog@ucvlima.edu.pe
Una de las tareas ms importantes de un desarrollador de
bases de datos es la de optimizacin, ajuste, puesta a punto
o tunning. Hay que tener en cuenta que las sentencias g y q q
SQL pueden llegar a ser muy complejas y conforme el
esquema de base de datos va creciendo, las sentencias son
ms complejas y confusas A veces es difcil escribir la ms complejas y confusas. A veces es difcil escribir la
sentencia correcta a la primera. Por todo ello despus de
tener cada uno de los procesos escritos, hay que pasar por
una etapa de tunning en la que se revisan todas las
sentencias SQL para poder optimizarlas conforme a la
experiencia adquirida. p q
Tanto por cantidad como por complejidad, la mayora de las
optimizaciones deben hacerse sobre sentencias SELECT,
ya que son (por regla general) las responsables de la mayor ya que son (por regla general) las responsables de la mayor
prdida de tiempos.
Procesamiento de consultas en Oracle
Plan de Ejecucin
La ejecucin de una consulta DML puede requerir
de varios pasos a ser realizados por el gestor.
C d d ll d t t Cada uno de ellos puede tanto recuperar
fsicamente datos de la BD, como preparar los
datos para realizar cierta operacin sobre ellos.
La combinacin de los pasos a realizar por gestor
para responder a una consulta se denomina Plan
de Ejecucin de Ejecucin.
Plan de Ejecucin
Considerar la siguiente consulta:
SELECT ename, j ob, sal , dname
FROM d t d FROM emp e, dept d
WHERE e. dept no = d. dept no
AND NOT EXI STS (
SELECT * FROM sal gr ade g
WHERE e. sal BETWEEN
l osal AND hi sal ) ;
I D OPERATI ON OPTI ONS OBJ ECT_NAME
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Plan de ejecucin mostrado por Oracle
0 SELECT STATEMENT
1 FI LTER
2 NESTED LOOPS
3 TABLE ACCESS FULL EMP
4 TABLE ACCESS BY ROWI D DEPT
5 I NDEX UNI QUE SCAN PK_DEPTNO
6 TABLE ACCESS FULL SALGRADE
Orden de Ejecucin
Los pasos de un plan de ejecucin no son ejecutados en el
orden que estn numerados.
Oracle primero realiza los pasos indicados por los nodos p p p
hojas del plan y luego realiza las operaciones indicadas por
lo nodos padres de estos.
Las filas retornadas en los pasos hijos se convierten en las p j
entradas de los pasos padres.
Orden de Ejecucin
La ejecucin de este plan es el siguiente
Oracle realiza el paso 3 y retorna las
filas, una a una, para el paso 2.
Para cada fila retornada en el paso 3 Para cada fila retornada en el paso 3
se realiza lo siguiente:
Oracle ejecuta el paso 5 que consiste
en explorar el indice pk_deptno
retornando todos los punteros (rowid) retornando todos los punteros (rowid)
a la tabla detp.
Oracle ejecuta el paso 4 retornando
las filas especificadas por los rowid al
paso 2 paso 2.
Oracle ejecuta el paso 2, reuniendo
un fila del paso 3 con un fila del paso
4 y devuelve el resultado al paso 1.
Oracle ejecuta el paso 3 retornan las Oracle ejecuta el paso 3 retornan las
filas si las hubiere al paso 1.
Oracle ejecuta el paso 1. Si no
retorna ninguna fila del paso 6, se
devuelve la fila del paso 2 como parte p p
del resultado.
Explain Plan
La sentencia EXPLAIN PLAN de Oracle indica cual es el plan de
ejecucin que se sigue para una consulta DML dada.
EXPLAI N PLAN
SET st at ement i d = j ob SET st at ement _i d = j ob
FOR SELECT ename, j ob, sal , dname FROM emp e, dept d
WHERE e. dept no = d. dept no
AND NOT EXI STS ( SELECT * FROM sal gr ade
WHERE e. sal BETWEEN l osal AND hi sal ) ; ) ;
El resultado de la sentencia EXPLAIN PLAN se guarda en una tabla
temporal llamada PLAN_TABLE.
Para recuperar el ultimo plan creado se puede utilizar el script
utlxpls.sql
@ut l xpl s. sql
Tambien se puede utilizar la siguiente funcion:
SELECT PLAN TABLE OUTPUT SELECT PLAN_TABLE_OUTPUT
FROM TABLE( DBMS_XPLAN. DI SPLAY( ' PLAN_TABLE' , j ob' , ' TYPI CAL' ) ) ;
Optimizador Basado en Costo
El optimizador es el corazn del procesamiento de consultas
en Oracle
Oracle incorpora dos tipos de optimizadores p p p
Optimizador basado en reglas (Heursticas).
Optimizador basado en costo.
El optimizador intenta encontrar la manera ms eficiente El optimizador intenta encontrar la manera ms eficiente
de ejecutar una consulta.
Modo de optimizacin
El parmetro OPTIMIZER_MODE de Oracle permite establecer el
enfoque de optimizacin a aplicar por el optimizador en una
sesin, los valores para este parmetro son:
CHOOSE El ti i d d id t li ti i i b d CHOOSE: El optimizador decide entre aplicar un optimizacin basada
en costo o una optimizacin heurstica segn se disponga de
estadsticas de los datos.
ALL_ROWS: El optimizador aplica un optimizacin basada en costo
eligiendo el mejor plan en trminos de rendimiento tal que se
recuperen todas la filas a la vez.
FIRST_ROWS_n : El optimizador aplica una optimizacin basada en
costo en trminos de minimizar el tiempo requerido para recuperar las p q p p
primera n filas. Ej. FIRST_ROWS_100.
FIRST_ROWS : El optimizador hace una optimizacin mixta basada en
heursticas y costo tal que se minimiza el tiempo en recuperar las
primeras filas del resultado primeras filas del resultado.
RULE : El optimizador realiza un optimizacin heurstica.
Se puede establece el modo de optimizacin para una sesin
mediante la siguiente sentencias
ALTER SESSION SET OPTIMIZER_MODE = FIRST_ROWS_1;
Optimizador Basado en Costo
El optimizador basado en costo (CBO) estima el costo de
los diferentes planes de una consulta basndose en los
diferentes caminos de acceso posible a los datos y a la
informacin estadstica guardada en el catlogo informacin estadstica guardada en el catlogo.
El CBO realiza los siguientes pasos
Genera un conjunto de planes potenciales basado en los Genera un conjunto de planes potenciales basado en los
diferentes caminos del accesos y los hints.
Estima el costo de cada plan basado en la informacin p
estadstica. El clculo se hace tomando las como mtricas el
acceso a disco, el uso de CPU y el uso de memoria.
Compara los planes y elige el de menor costo Compara los planes y elige el de menor costo.
Partes del CBO
Las operaciones
del CBO
incluyen:
Transformacin
de consultas de consultas
Estimacin del
costo
Generacin de
Planes
Tipos de Acceso a datos considerados por CBO
Full Scan
Cuando no hay ndices
Cuando se leen varios bloques de datos
Cuando las tablas son pequeas
Alto nivel de paralelismo
Rowid Scans
U id di i i di l d fil bl Un rowid es una direccin que indica el datafile, bloque y
posicin de una fila.
Cuando se necesitan de filas que fueron determinadas a travs
de un ndice en la tabla.
Index Scan
Cuando el factor de agrupamiento del ndice (index cluster
factor) es pequeo.
Cuando el ndice es nico (INDEX UNIQUE SCAN ).
Cuando la seleccin involucra un rango. (INDEX RANGE)
Cuando una consulta se basa en un columna interna de un
ndice compuesto se pueden analizar los n subndices para ndice compuesto, se pueden analizar los n subndices para
determinar los rowid de la filas a recuperar (INDEX SKIP
SCAN)
Tipos de Acceso a datos considerados por CBO
Cluster Access
Cuando se requiere de las filas con un mismo valor de
agrupamiento, se accede al ndice del cluster que ndica el
bloque de datos a leer.
Nested Loop Join
Cuando las tablas son pequeas
Cuando una de las tablas posee indice.
Hash Join
Cuando ambas tablas son grandes g
Se construye un tabla hash sobre la tabla ms pequea
La reunin se realiza iterando sobre la tabla ms grande.
Merge Join Merge Join
Cuando ambas tablas son muy grandes.
Hints de Optimizacin
Los hints son utilizados para indicar al optimizador que
estrategias debera ser utilizadas en un plan.
SELECT / *+ FULL( e) */ empl oyee_i d, l ast _name
FROM hr . empl oyees e WHERE l ast _name LI KE ( Smi t h%) ;
Son utilizados para brindar mayor informacin al
optimizador acerca de los datos.
Por ejemplo, el diseador de la BD podra conocer cuando
un ndice es mas selectivo para una consulta y por lo tanto
indicar al optimizador que lo use en un plan.
SELECT / *+ I NDEX ( empl oyees emp_depar t ment _i x) */
empl oyee_i d, depar t ment _i d
FROM empl oyees
WHERE depar t ment i d > 50; _
Ejemplos de algunos Hints
INDEX
Instruye al optimizador a utilizar un determinado ndice
SELECT / *+ I NDEX ( empl oyees emp_depar t ment _i x) */
empl oyee_i d, depar t ment _i d FROM empl oyees _ _
WHERE depar t ment _i d > 50;
INDEX JOIN
Instruye al optimizador a utilizar la reunin de dos ndices.
SELECT / *+ I NDEX J OI N( e emp manager i x emp depar t ment i x) _ ( p_ g _ p_ p _ )
*/ depar t ment _i d
FROM empl oyees e WHERE manager _i d < 110 AND depar t ment _i d <
50;
NOCACHE
I l i i d l i i d di l Instruye al optimizador al optimizador a que disponga los
bloquea ledos de una relacin al final de la lista LRU
SELECT / *+ FULL( hr _emp) NOCACHE( hr _emp) */ l ast _name
FROM empl oyees hr _emp;
NO_INDEX
Instruye al optimizador a no utilizar uno o ms ndices
SELECT / *+ NO_I NDEX( empl oyees emp_emp_i d_pk) */
empl oyee i d FROM empl oyees WHERE empl oyee i d > 200; p y _ p y p y _ ;
Ejemplos de algunos Hints
USE_HASH
Instruye al optimizador a utilizar la estrategia de hash para realizar
una reunin
SELECT / *+ USE HASH( l h) */ * FROM or der s h, or der i t ems l S C / US _ S ( ) / O o de s , o de _ t e s
WHERE l . or der _i d = h. or der _i d AND l . or der _i d > 3500;
USE_MERGE
Instruye al optimizador a utilizar la estrategia de mezcla para realizar
una reunin una reunin
SELECT / *+ USE_MERGE( e d) */ *
FROM empl oyees e, depar t ment s d
WHERE e. depar t ment _i d = d. depar t ment _i d;
USE NL USE_NL
Instruye al optimizador a utilizar la estrategia de bucle anidado para
realizar una reunin
SELECT / *+ USE_NL( l h) */ h. cust omer _i d, l . uni t _pr i ce * l . quant i t y
FROM or der s h , or der i t ems l WHERE l . or der i d = h. or der i d; , _ _ _
USE_NL
Instruye al optimizador a utilizar la estrategia de bucle anidado con
ndice para realizar una reunin
SELECT / *+ USE NL WI TH I NDEX( l i t empr oduct i x) */ * SELECT / + USE_NL_WI TH_I NDEX( l i t em_pr oduct _i x) /
FROM or der s h, or der _i t ems l WHERE l . or der _i d = h. or der _i d
AND l . or der _i d > 3500;
Ejercicios
Visualizar el plan de ejecucin para
Sel ect * f r omhr . l ocat i ons
wher e l ocat i on i d > 1100; wher e l ocat i on_i d > 1100;
Sel ect * f r omhr . l ocat i ons
wher e st r eet _addr ess l i ke %Zagor a% ;
Crear el ndice siguiente y volver a probar el plan de la Crear el ndice siguiente y volver a probar el plan de la
consulta anterior
Cr eat e i ndex l oc_st r eet _i x on
l ocat i ons( st r eet addr ees) ; l ocat i ons( st r eet _addr ees) ;
sel ect / *+ I NDEX( l ocat i ons l oc_st r eet _i x) */ *
f r oml ocat i ons wher e st r eet _addr ess l i ke
' %Zagor a%' ; %Zagor a%;
Ejercicios
Visualizar el plan de ejecucin para
SELECT * FROM empl oyees e, depar t ment s d
WHERE e depar t ment i d = d depar t ment i d; WHERE e. depar t ment _i d = d. depar t ment _i d;
SELECT / *+ USE_MERGE( e d) */ *
FROM empl oyees e, depar t ment s d
WHERE e depar t ment i d = d depar t ment i d; WHERE e. depar t ment _i d = d. depar t ment _i d;
SELECT / *+ USE_HASH( e d) */ *
FROM empl oyees e, depar t ment s d
WHERE e depar t ment i d = d depar t ment i d; WHERE e. depar t ment _i d = d. depar t ment _i d;
SELECT / *+ NO_I NDEX( empl oyees emp_emp_i d_pk) */
empl oyee_i d FROM empl oyees WHERE empl oyee_i d > 200;

También podría gustarte