Está en la página 1de 14

1

OPTIMIZADOR ORACLE.
1. La meta: escoger el modo ms eficiente de ejecutar una declaracin 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

NESTED LOOPS

TABLE ACCESS (FULL) salgrade

TABLE ACCESS (FULL) emp

TABLE ACCESS (BY ROWID) dept

INDEX (UNIQUE SCAN) pk_deptno

ID 0 1 2 3 4 5 6

OPERATION SELECT STATEMENT FILTER NESTED LOOPS TABLE ACCESS TABLE ACCESS INDEX TABLE ACCESS

OPTIONS

OBJECT_NAME

FULL BY ROWID UNIQUE SCAN FULL

EMP DEPT PK_DEPTNO SALGRADE

2. Como se lleva a cabo la optimizacin : 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. Observacin : 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 declaracin en una equivalente (manipulacin 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 que leer todos los bloques que contienen la tabla.

costo

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 declaracin original y optimiza el resultado. Ejemplo1 : CREATE VIEW emp_10

AS SELECT empno,ename,job,... La consulta :

FROM emp WHERE deptno = 10;

SELECT empno FROM emp_10 WHERE empno > 7800;

Se transforma en : SELECT empno FROM emp WHERE deptno = 10 AND empno > 7800; Observacion: Si la definicin 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 optimizacin TIPOS DE OPTIMIZACION: Basada en reglas: Se apoya en una informacin predefinida, donde cada operacin tiene un rango de menor a mayor. Escoge la opcin 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 estadsticas almacenadas en el diccionario de datos (tamao de las tablas, indices existentes, imagen de los ndices, etc). Tambien considera sugerencias definidas por quien ejecuta la instrucccin. Vase 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 1 2 3 4 5 Camino de Acceso Single row by ROWID Single row by cluster join Single row by hash cluster key with unique or primary key Single row by unique or primary key. cluster join

6 7 8 9 10 11 12 13 14 15

hash cluster key Indexed cluster key Composite index single-column index Bounded range search on indexed columns Unbounded range search on indexed columns sort-merge join MAX or MIN of indexed column ORDER by on indexed columns 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 select statement nested loops table access index table access OPTIONS OBJECT_NAME

by rowid unique scan cluster

emp pk_emp dept

Camino 3 : Vlido 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 select statement table access OPTIONS cluster OBJECT_NAME inventory

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 select statement table access index

OPTIONS by rowid range scan

OBJECT_NAME emp 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 select statement table access and-equal index index OPTIONS by rowid range scan range scan OBJECT_NAME emp job_idx dept_idx

Camino 10 : Bsqueda por rango limitado sobre una columna con ndice. SELECT * FROM emp WHERE deptno BETWEEN 30 AND 50; OPERATION select statement table access index OPTIONS by rowid range scan OBJECT_NAME emp dept_idx

Nota : valida si uso la primera columna de un ndice compuesto. Camino 11: Bsqueda con rango ilimitado sobre una columna con ndice. SELECT * FROM emp WHERE deptno > 30;

OPERATION select statement

OPTIONS

OBJECT_NAME

table access index

by rowid range scan

emp dept_idx

Camino 12:

Reunin natural con clasificacin-mezcla. SELECT * FROM emp, dept WHERE emp.deptno = dept.deptno. Asumiendo que no hay cluster entre ambas tablas. OPERATION select statement merge join sort table access sort table access OPTIONS OBJECT_NAME

join full join full

emp dept

Camino 13 : Mximo o mnimo de una columna con ndices. SELECT max(sal) FROM emp; Slo aparece la columna con ndice en el SELECT y no hay WHERE ni GROUP BY. OPERATION select statement aggregate index OPTIONS OBJECT_NAME

range scan

sal_idx

Camino 14 : ORDER BY en columna con ndice. SELECT * FROM emp order by empno; OPERATION select statement table access index Camino 15 : Lectura completa de la tabla. SELECT * FROM emp; OPERATION select statement table access OPTIONS full OBJECT_NAME emp OPTIONS by rowid range scan OBJECT_NAME emp pk_emp

Observacin : Situaciones que provocan un barrido general. col1 > col2 ( idem para >=, <= ,etc ) col NOT IN col IS NOT NULL col LIKE PATRON y pertenecen a la misma tabla. col != expresion1 = expresion2;

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. Optimizacin basada en costos. - Escoge el camino de menor costo entre todos los posibles. - El costo lo obtiene de estadsticas almacenadas en el Diccionario de datos; criterios para la escogencia: - selectividad de las filas ( nmero de filas en la respuesta). Normalmente se usan los ndices para buenas selectividades y el barrido de toda la si es baja . - El parmetro 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 estadsticas USER_TAB_COLUMNS.NUM_DISTINCT y USER_TABLES.NUM_ROWS para determinar el nmero 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 distribucin uniforme entre estos dos rangos. Calcula que porcentaje de valores estn 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 frmula : S = ABS(S1+S2-1).

tabla

2.6. Se escoge mtodo de ejecucin 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 operacin para el join : NESTED LOOPS SORT MERGE

CLUSTER c. El orden del join, cuando es un join de ms 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 2 TABLE ACCESS (FULL) emp

TABLE ACCESS (BY ROWID) dept INDEX (UNIQUE SCAN) pk_deptno

b. SORT-MERGE JOIN. Usado solo en equi-join. SELECT * FROM emp.dept WHERE emp.deptno = dept.deptno;
1 MERGE JOIN

4 2 SORT (JOIN)

SORT (JOIN)

TABLE ACCESS (FULL) dept

TABLE ACCESS (FULL) emp

c. CLUSTER JOIN. Util en equi-join. SELECT * FROM emp.dept WHERE emp.deptno = dept.deptno;

NESTED LOOPS

3 2 8

TABLE ACCESS (FULL) dept

TABLE ACCESS (CLUSTER) emp

2.6.3. Evaluacin 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 ms 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 nmero 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 mtodo cuya primera tabla tenga el ms alto rango entre los caminos de acceso.

2.6.4 Evaluacin por costos. Se genera un conjunto de planes de ejecucin basado en el posible orden del join, operacin a emplear y caminos disponibles. Se estima el costo de cada uno y se escoge el ms barato. La evaluacin se lleva a cabo de la siguiente manera : NESTED LOOPS : SORT MERGE : Usa la tabla con ms filas como tabla externa.

Se consideran otros factores : SORT_AREA_SIZE DB_FILE_MULTIBLOCK_READ_COUNT. Si es una reunin externa, la tabla con el (+) debe colocarse de ltima dentro de la condicin 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 instruccin 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 --------- ------------------------------ -----------0 SELECT STATEMENT Cost = 16 1 FILTER 2 MERGE JOIN 3 SORT JOIN 4 NESTED LOOPS 5 TABLE ACCESS FULL 5 TABLE ACCESS BY ROWID OBJECT_NAME ------------------------------

S_EMP S_DEPT

10

11 6 3 4 2 3 3 4 INDEX SORT TABLE ACCESS FILTER TABLE ACCESS SORT TABLE ACCESS UNIQUE SCAN JOIN FULL FULL AGGREGATE FULL S_DEPT_ID_PK S_REGION S_CUSTOMER 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.

FILTER

TABLE ACCESS (FULL) dept

TABLE ACCESS (FULL) emp

SELECT dname,deptno FROM dept WHERE NOT EXISTS ( SELECT deptno FROM emp WHERE dept.deptno = emp.deptno);

FILTER 1

TABLE ACCESS (FULL) dept

INDEX RANGE_SCAN idx_deptno

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 instruccin : 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 parmetro llamado USER_DUMP_DEST. archivo_de_salida : entrega la informacin del plan de ejecucin seguido por cadai instruccin y su costo.

call Parsed Execute Fetch total

count 3 3 6 12

cpu 0.20 0.01 0.13 0.34

elapsed 0.24 0.01 0.13 0.38

disk 4 0 5 9

query 60 0 98 158
+

current 4 0 89 93

rows 0 0 48 48

Lecturas fsicas.

Lecturas Logicas

Filas retornadas

a) Si las lecturas lgicas estn muy por encima de las filas retornadas pueden faltar ndices. b) b.Si la columna count de la operacin fetch es muy cercana a la columna rows de la misma operacin use la facilidad array proccessing. c) Si La columna count de la operacin parsed es muy cercana a la columna count de la fila execute es probable que tenga una libreria cache pequea. vase 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 lgicas, el database buffer cache puede ser insuficiente. Vase DB_BLOCK_BUFFER. e) Tambien es posible que est reciente el arranque de la B. de D. f) La columna query significa el nmero de veces que necesit informacin desde los segmentos de Rollback.

5. Cual estrategia seguir? Se recomienda usar siempre la optimizacin basada en costos, especialmente para grandes volumenes de informacin. 5.2. Debo correr peridicamente para cada tabla el comando:

12

13

ANALYZE TABLE emp COMPUTE STATISTICS; ANALYZE TABLE emp ESTIMATE STATISTICS;

5.2. Para aplicaciones en BATCH es deseable lograr una meta de mejor desempeo global: ALTER SESSION SET OPTIMIZER_GOAL = ALL_ROWS. 5.3. Para aplicaciones en lnea es deseable lograr una meta de respuesta inicial rpida: ALTER SESSION SET OPTIMIZER_GOAL = FIRST_ROWS.

5.4. Puedo inducir al optimizador en la escogencia del mtodo de ejecucin usando HINTS. El programador puede definir : El esquema de optimizacin, la meta de optimizacin, el camino de acceso para las tablas involucradas, el order del join y la operacin 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 versin de ORACLE puede introducir mejoras y variantes al optimizador. Lo resumido en estas pginas da una idea general del funcionamiento, pero en todos los casos lo recomendado es consultar los manuales que correspondan a la versin 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 mquina ni los indices bitmap..

14