14 OptimizadorOracle PDF

También podría gustarte

Está en la página 1de 14

1

OPTIMIZADOR ORACLE.

1. La meta: escoger el modo más eficiente de ejecutar una declaración S.Q.L.

Ejemplo :

SELECT ename,job, sal , dname


FROM emp,dept
WHERE emp.deptno = dept.deptno
AND NOT EXISTS ( SELECT * FROM salgrade
WHERE emp.sal BETWEEN losal and hisal );

FILTER
1

2 NESTED 6 TABLE
LOOPS ACCESS
(FULL)
salgrade
TABLE
3 TABLE 4 ACCESS
ACCESS (BY ROWID)
(FULL) dept
emp

INDEX
5 (UNIQUE
SCAN)
pk_deptno

ID OPERATION OPTIONS OBJECT_NAME


0 SELECT STATEMENT
1 FILTER
2 NESTED LOOPS
3 TABLE ACCESS FULL EMP
4 TABLE ACCESS BY ROWID DEPT
5 INDEX UNIQUE SCAN PK_DEPTNO
6 TABLE ACCESS FULL SALGRADE

1
2

2. Como se lleva a cabo la optimización :

2.1 Se evaluan todas las condiciones y expresiones que sea posible.

eje1: sal > 24000/12. es transformada en sal > 2000.


sal * 12 > 24000 NO es transformada.
Observación : comparar columnas con constantes siempre que sea posible.

eje2 : ename IN ( „SMITH‟, „KING‟, „JONES‟) es transformada en


ename = „SMITH‟ OR ename = „KING‟ OR ename = „JONES‟
Observacion : Idem para ANY y para ALL

eje3: x > ANY ( SELECT sal FROM emp WHERE job = „ANALYST‟)
es transformada en
EXISTS ( SELECT sal FROM emp WHERE job = „ANALYST‟ AND x > sal );

2.2. Transforma la declaración en una equivalente (manipulación algebraica).

ejemplo 1 :
SELECT * FROM emp WHERE job = „CLERK‟ OR depto = 10;

Si hay índice sobre ambas columnas se transforma en :

SELECT * FROM emp WHERE job = „CLERK‟


UNION ALL
SELECT * FROM emp WHERE depto = 10 and job <> „CLERK‟;

Si uso el optimizador basado en reglas, se asume que el uso de los índices es de menor costo
que leer todos los bloques que contienen la tabla.

Con el optimizador basado en costos se evaluan las dos alternativas y se asume la de menor
costo.

ejemplo 2 :

SELECT * FROM accounts WHERE custno IN ( SELECT custno FROM customers);

Si custno tiene un índice en customers, Se transforma en

SELECT accounts.*
FROM accounts,customers WHERE accounts.custno = customers.custno;

2.3. Une las vistas con la declaración original y optimiza el resultado.

Ejemplo1 :
CREATE VIEW emp_10

2
3

AS SELECT empno,ename,job,... FROM emp WHERE deptno = 10;

La consulta : SELECT empno FROM emp_10 WHERE empno > 7800;

Se transforma en :
SELECT empno FROM emp WHERE deptno = 10 AND empno > 7800;

Observacion: Si la definición de la vista involucra operadores como UNION, INTERSECT,


MINUS, GROUP BY,CONNECT BY, DISTINCT o funciones de grupo, no siempre es posible
mezclar la vista con el SELECT que se ejecute.

2.4. Escoge el criterio de optimización

TIPOS DE OPTIMIZACION:

 Basada en reglas: Se apoya en una información predefinida, donde cada operación tiene un
rango de menor a mayor. Escoge la opción de menor rango.

 Basada en costos: Entre todos los posibles caminos de acceso escoge el de menor costo; para
calcular dicho costo se apoya en estadísticas almacenadas en el diccionario de datos (tamaño
de las tablas, indices existentes, imagen de los índices, etc). Tambien considera “sugerencias”
definidas por quien ejecuta la instruccción.

Véase OPTIMIZER_MODE en el init.ora. valores posibles: CHOOSE, COST o RULE. En su


lugar usar el comando ALTER SESSION SET OPTIMIZER_GOAL= ALL_ROWS
FIRST_ROWS
RULE
CHOOSE

2.5. Para cada tabla utilizada se escoge uno ó varios caminos de acceso a los datos.

2.5.1. Mecanismos de acceso a una tabla.

FULL TABLE SCAN.


TABLE ACCESS BY ROWID.
CLUSTER SCAN. Obtiene ROWID del índice y luego lee los bloques de la clave cluster.
HASH SCAN.
INDEX SCAN. (UNIQUE) o (RANGE).

2.5.2. Tabla de rangos para el optimizador basado en reglas.

Rango Camino de Acceso


1 Single row by ROWID
2 Single row by cluster join
3 Single row by hash cluster key with unique or primary key
4 Single row by unique or primary key.
5 cluster join

3
4

6 hash cluster key


7 Indexed cluster key
8 Composite index
9 single-column index
10 Bounded range search on indexed columns
11 Unbounded range search on indexed columns
12 sort-merge join
13 MAX or MIN of indexed column
14 ORDER by on indexed columns
15 Full table scan

Camino 1: Si uso el ROWID o la clausula CURRENT OF CURSOR.

Camino 2 : SELECT emp, dept FROM emp. dept


WHERE emp.deptno = dept.deptno AND emp.empno = 7900;

empno es la clave primaria y hay cluster por deptno.

OPERATION OPTIONS OBJECT_NAME


select statement
nested loops
table access by rowid emp
index unique scan pk_emp
table access cluster dept

Camino 3 : Válido si se cumplen ambas condiciones y el predicado usa la igualdad.

Camino 4 : Utiliza al árbol B para obtener el rowid.

Camino 5 : SELECT * FROM emp,dept WHERE emp.deptno = dept.deptno;


Existe cluster por deptno entre ambas tablas.

OPERATION OPTIONS OBJECT_NAME


select statement
nested loops
table access full dept
table access cluster emp
Camino 6 : Clave aleatoria. La columna con clave HASH no hace parte de la clave primaria.

SELECT * FROM item WHERE orderno = 65118968;

Camino 7 : Clave cluster.


SELECT warehouse_id,product_id,qtty
FROM INVENTORY WHERE product_id = 1000;

Si hay cluster por product_id.

OPERATION OPTIONS OBJECT_NAME


select statement
table access cluster inventory

4
5

index unique scan prod_idx

Camino 8 : Indice compuesto.


Las columnas del predicado hacen parte de un índice compuesto no único.
SELECT * FROM emp WHERE depto = 20 AND region = 1;

Asumiendo índice compuesto (region,depto)

OPERATION OPTIONS OBJECT_NAME


select statement
table access by rowid emp
index range scan reg_dept_idx

Camino 9 : Indice de solo una columna. Cada índice no único está creado sobre una sola
columna de la tabla .

SELECT * FROM emp WHERE job = „ANALYST‟ AND deptno = 20;


Asumiendo índices en ambas columnas.

OPERATION OPTIONS OBJECT_NAME


select statement
table access by rowid emp
and-equal
index range scan job_idx
index range scan dept_idx

Camino 10 : Búsqueda por rango limitado sobre una columna con índice.
SELECT * FROM emp WHERE deptno BETWEEN 30 AND 50;

OPERATION OPTIONS OBJECT_NAME


select statement
table access by rowid emp
index range scan dept_idx

Nota : valida si uso la primera columna de un índice compuesto.

Camino 11: Búsqueda con rango ilimitado sobre una columna con índice.
SELECT * FROM emp WHERE deptno > 30;

OPERATION OPTIONS OBJECT_NAME


select statement

5
6

table access by rowid emp


index range scan dept_idx

Camino 12: Reunión natural con clasificación-mezcla.


SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno.
Asumiendo que no hay cluster entre ambas tablas.

OPERATION OPTIONS OBJECT_NAME


select statement
merge join
sort join
table access full emp
sort join
table access full dept

Camino 13 : Máximo o mínimo de una columna con índices.


SELECT max(sal) FROM emp;
Sólo aparece la columna con índice en el SELECT y no hay WHERE ni GROUP BY.

OPERATION OPTIONS OBJECT_NAME


select statement
aggregate
index range scan sal_idx

Camino 14 : ORDER BY en columna con índice.


SELECT * FROM emp order by empno;

OPERATION OPTIONS OBJECT_NAME


select statement
table access by rowid emp
index range scan pk_emp

Camino 15 : Lectura completa de la tabla.


SELECT * FROM emp;

OPERATION OPTIONS OBJECT_NAME


select statement
table access full emp

Observación : Situaciones que provocan un barrido general.

col1 > col2 ( idem para >=, <= ,etc ) y pertenecen a la misma tabla.
col NOT IN
col IS NOT NULL col !=
col LIKE PATRON expresion1 = expresion2;

6
7

NOT EXISTS subquery.


Condiciones sobre columnas sin índices.

2.5.3. Ejemplo de estrategia basada en reglas.

SELECT empno FROM emp WHERE ename = „PEPE‟ and sal > 2000;
Asumo la tabla con índice en las columnas:
empno (su clave primaria), ename ( no único) y sal (no único).

Caminos posibles :
camino 9 : utilizando ename = „PEPE‟.
camino 11: utilizando sal > 2000;
camino 15 : barrido completo.
La clave primaria no se tiene presente pues no aparece en el predicado.
El optimizador escoge el camino 9.

2.5.4. Optimización basada en costos.

- Escoge el camino de menor costo entre todos los posibles.


- El costo lo obtiene de estadísticas almacenadas en el Diccionario de datos;
criterios para la escogencia:
- selectividad de las filas ( número de filas en la respuesta).
Normalmente se usan los índices para buenas selectividades y el barrido de toda la
tabla si es baja .
- El parámetro DB_FILE_MULTIBLOCK_READ_COUNT.
Eje 1:
SELECT empno FROM emp WHERE ename = „PEPE‟ and sal > 2000;
Asumo la tabla con índice en las columnas:
empno (su clave primaria), ename ( no único) y sal (no único).
EL optimizador usa las estadísticas USER_TAB_COLUMNS.NUM_DISTINCT
y USER_TABLES.NUM_ROWS para determinar el número de filas a recuperar.

Eje 2 :
SELECT * FROM emp WHERE empno < 7500;

Usa USER_TAB_COLUMNS.HIGH_VALUE y USER_TAB_COLUMNS.LOW_VALUE.


Para todos los valores del índice asume distribución uniforme entre estos dos rangos.
Calcula que porcentaje de valores están por debajo de 7500 y define la estrategia.

Si uso col BETWEEN A AND B se descompone en col <= B AND col >= A y calcula la
selectividad de cada caso, S1 y S2 respectivamente. Luego aplica la fórmula :
S = ABS(S1+S2-1).

2.6. Se escoge método de ejecución para las reuniones naturales.

2.6.1. Los aspectos involucrados son :


a. Escoger el camino de acceso a cada tabla involucrada en el join.
b. Escoger la operación para el join : NESTED LOOPS
SORT MERGE

7
8

CLUSTER
c. El orden del join, cuando es un join de más de dos tablas.

2.6.2. Operaciones posible para un join.

a. NESTED LOOPS
Ejemplo: SELECT * FROM emp.dept WHERE emp.deptno = dept.deptno;

1 NESTED
LOOPS

4 TABLE
2 TABLE ACCESS
ACCESS (BY ROWID)
(FULL) dept
emp
INDEX
(UNIQUE
SCAN)
3 pk_deptno

b. SORT-MERGE JOIN. Usado solo en equi-join.

SELECT * FROM emp.dept WHERE emp.deptno = dept.deptno;

1 MERGE
JOIN

4
SORT
2 SORT
(JOIN)
(JOIN)

TABLE TABLE
3 ACCESS 5 ACCESS
(FULL) (FULL)
dept emp

c. CLUSTER JOIN. Util en equi-join.

SELECT * FROM emp.dept WHERE emp.deptno = dept.deptno;

1 NESTED
LOOPS

3
2
8
9

TABLE ACCESS
TABLE
(CLUSTER)
ACCESS
emp
(FULL)
dept

2.6.3. Evaluación por reglas:

 Se generan R posibles secuencias para el join, definiendo en cada caso una tabla inicial
diferente.
 Para definir el orden subsiguiente de las tablas cada vez se escoge , entre las restantes,
aquella que tenga el camino de acceso de más alto rango.
 Se define para cada par de tablas ( ó el resultado del par anterior con la tabla siguiente) la
manera de resolver el join, bajo los siguientes criterios:
Si la segunda tabla tiene un camino de acceso igual o menor a 11 se aplica NESTED
LOOPS.
Si la segunda tabla tiene un camino mayor que 12 y es un equijoin se aplica SORT
MERGE.
Si la segunda tabla tiene un camino mayor que 12 y No es equijoin se aplica NESTED
LOOPS.
 Se escoge entre los R planes resultantes aquel que tenga el mayor número de NESTED
LOOPS - con INDEX SCAN en la tablas usadas en el ciclo interno. SI hay empate en varios
planes se evalua adicionalmente y en su orden los siguientes criterios:
Escoge la que tenga menos NESTED LOOPS con FULL SCAN.
Escoge el que tenga menos SORT MERGE.
Si continua el empate escoge el método cuya primera tabla tenga el más alto rango entre
los caminos de acceso.

2.6.4 Evaluación por costos. Se genera un conjunto de planes de ejecución basado en el posible
orden del join, operación a emplear y caminos disponibles. Se estima el costo de cada uno y se
escoge el más barato. La evaluación se lleva a cabo de la siguiente manera :

 NESTED LOOPS : Usa la tabla con más filas como tabla externa.
 SORT MERGE :

Se consideran otros factores :


SORT_AREA_SIZE
DB_FILE_MULTIBLOCK_READ_COUNT.
Si es una reunión externa, la tabla con el (+) debe colocarse de última dentro de la condición del
join.

3. Herramientas para el afinamiento de instrucciones S.Q.L.

3.1. Correr el script utlxplan.sql Crea la tabla plan_table


create table PLAN_TABLE (
statement_id varchar2(30),
timestamp date,
remarks varchar2(80),
operation varchar2(30),

9
10

options varchar2(30),
object_node varchar2(128),
object_owner varchar2(30),
object_name varchar2(30),
object_instance numeric,
object_type varchar2(30),
optimizer varchar2(255),
search_columns numeric,
id numeric,
parent_id numeric,
position numeric,
other long);

3.2. Ejecuto la la instrucción de la siguiente manera:

SQL> EXPLAIN PLAN FOR SELECT e.id, first_name||' '||last_name nombre,


d.id, d.name dpto,r.name region
FROM s_emp e, s_dept d, s_region r
WHERE EXISTS ( SELECT 'x'
FROM s_customer c
WHERE e.id = c.sales_rep_id
and 1 < (SELECT count(o.id)
FROM s_ord o
WHERE o.customer_id = c.id ))
AND e.dept_id = d.id
AND d.region_id = r.id;

3.3. Ejecuto el siguiente SELECT .

SQL>col operacion format a30


SQL>col options format a12
SQL> select level-1, lpad(' ',2*(level-1)) || operation ||
' '||decode(id,0,'Cost = '||position) "operacion" ,options,object_name
from plan_table
start with id=0
connect by prior id = parent_id;

3.4. Resultado :

LEVEL-1 operacion OPTIONS OBJECT_NAME


--------- ------------------------------ ------------ ------------------------------
0 SELECT STATEMENT Cost = 16
1 FILTER
2 MERGE JOIN
3 SORT JOIN
4 NESTED LOOPS
5 TABLE ACCESS FULL S_EMP
5 TABLE ACCESS BY ROWID S_DEPT

10
11

6 INDEX UNIQUE SCAN S_DEPT_ID_PK


3 SORT JOIN
4 TABLE ACCESS FULL S_REGION
2 FILTER
3 TABLE ACCESS FULL S_CUSTOMER
3 SORT AGGREGATE
4 TABLE ACCESS FULL S_ORD

14 rows selected.

3.5. Considere instrucciones alternativas.

SELECT dname, deptno FROM dept WHERE deptno NOT IN ( select deptno FROM EMP);
Asuma que hay indice en la columna deptno de la tabla emp llamado idx_deptno.

1 FILTER

2 3 TABLE
TABLE
ACCESS ACCESS
(FULL) (FULL)
dept emp

SELECT dname,deptno FROM dept WHERE NOT EXISTS


( SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);

FILTER
1

2 3
TABLE INDEX
ACCESS RANGE_SCAN
(FULL) idx_deptno
dept

4. Utilidades SQL-TRACE y TKPROF.

4.1. Adecuar el ambiente :


En el init.ora defina :
TIMED_STATISTICS=TRUE.

11
12

USER_DUMP_DEST= directorio. Alli se crean los archivos que arrojan estas utilidades.

En la sesion dar el comando :


SQL>ALTER SESSION SET SQL_TRACE=TRUE;

desde PL.SQL user la instrucción : DBMS_SESSION.SET_SQL_TRACE(TRUE);


4.2. Ejecute todas las instrucciones y/o programas que desee evaluar.

4.3. Corra la utilidad TKPROF desde el sistema operativo.

$tkprof archivo_de_entrada archivo_de_salida explain=username/password

Archivo de entrada: generado por ORACLE en el directorio indicado por el parámetro


llamado USER_DUMP_DEST.
archivo_de_salida : entrega la información del plan de ejecución seguido por cadai
instrucción y su costo.

call count cpu elapsed disk query current rows


Parsed 3 0.20 0.24 4 60 4 0
Execute 3 0.01 0.01 0 0 0 0
Fetch 6 0.13 0.13 5 98 89 48
total 12 0.34 0.38 9 158 93 48

Lecturas Lecturas Filas


físicas. Logicas retornadas

a) Si las lecturas lógicas están muy por encima de las filas retornadas pueden faltar índices.
b) b.Si la columna count de la operación fetch es muy cercana a la columna rows de la misma
operación use la facilidad array proccessing.
c) Si La columna count de la operación parsed es muy cercana a la columna count de la fila
execute es probable que tenga una libreria cache pequeña. véase SHARED_POOL_SIZE.
Tambien es probable un manejo pobre de los cursores.
d) Si el total de la columna disk está cercano al total de lecturas lógicas, el database buffer
cache puede ser insuficiente. Véase DB_BLOCK_BUFFER.
e) Tambien es posible que está reciente el arranque de la B. de D.
f) La columna query significa el número de veces que necesitó información desde los
segmentos de Rollback.

5. Cual estrategia seguir?

Se recomienda usar siempre la optimización basada en costos, especialmente para grandes


volumenes de información.

5.2. Debo correr periódicamente para cada tabla el comando:

12
13

ANALYZE TABLE emp COMPUTE STATISTICS; o


ANALYZE TABLE emp ESTIMATE STATISTICS;

5.2. Para aplicaciones en BATCH es deseable lograr una meta de mejor desempeño global:
ALTER SESSION SET OPTIMIZER_GOAL = ALL_ROWS.

5.3. Para aplicaciones en línea es deseable lograr una meta de respuesta inicial rápida:
ALTER SESSION SET OPTIMIZER_GOAL = FIRST_ROWS.

5.4. Puedo inducir al optimizador en la escogencia del método de ejecución usando HINTS.

El programador puede definir : El esquema de optimización, la meta de optimización, el


camino de acceso para las tablas involucradas, el order del join y la operación de join a emplear.
Ejemplos:



SELECT /*+ALL_ROWS */ empno,ename, sal,job FROM emp WHERE empno = 7566;

SELECT /*+ FIRST_ROWS */ empno,ename, sal,job FROM emp WHERE empno = 7566



SELECT /*+ INDEX(sex_idx) */ name, height,weight FROM patients WHERE sex = „M‟;



CREATE TABLE tank_readings


( time DATE UNIQUE,
temperature NUMBER );

SELECT temperature
FROM tank_readings
WHERE time = ( SELECT MAX(time)
FROM tank_readings
WHERE time <= TO_DATE(:T) );

Proceso : Encuentra de menor a mayor todos los valores menores a T, entre ellos escoge el
mayor y se ejecuta la parte externa de la consulta.

SELECT /*+ INDEX_DESC(idx_time) */ temperature


FROM tank_readings
WHERE time <= TO_DATE(:T) AND ROWNUM = 1;

13
14

Recorre el índice de mayor a menor obtiene el ROWID del tiempo buscado y lee el bloque de
datos donde se halla almacenado;

Nota:

Cada versión de ORACLE puede introducir mejoras y variantes al optimizador.


Lo resumido en estas páginas da una idea general del funcionamiento, pero en todos los casos
lo recomendado es consultar los manuales que correspondan a la versión de ORACLE con la
que se trabaje. En el presente escrito no se incluyen las opciones de servidor de consultas en
paralelo que se aprovecha de la presencia de multiples procesadores un una máquina ni los
indices bitmap..

14

También podría gustarte