Sie sind auf Seite 1von 43

Herramientas para la optimizacin

Creacin de la tabla de Planes


1.

Se debe ejecutar el siguiente script para la creacin de la tabla de los planes (plan_table)
@utlxplan.sql

Ejemplo del EXPLAIN PLAN


SQL> 2 3 4 5 6 EXPLAIN PLAN set statement_id = 'demo01' for SELECT * FROM sh.products WHERE prod_category = 'Men' AND prod_subcategory = 'Jeans - Men';

Explained.

Nota: El comando EXPLAIN PLAN no ejecuta la instruccin

Salida del EXPLAIN PLAN


-------------------------------------------------------------------------| Id| Operation | Name |Rows|Bytes |Cost(%CPU)| -------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 68| 17340| 23 (9) | | 1 | TABLE ACCESS BY INDEX ROWID | PRODUCTS | 68| 17340| 23 (9) | | 2 | BITMAP CONVERSION TO ROWIDS | | | | | | 3 | BITMAP AND | | | | | | 4 | BITMAP CONVERSION FROM ROWIDS| | | | | |*5 | INDEX RANGE SCAN |PRODUCTS PROD_ SUBCAT_IX| 270| | 1(0) | | 6 | BITMAP CONVERSION FROM ROWIDS| | | | | |*7 | INDEX RANGE SCAN |PRODUCTS_ PRODCAT IX| 270| | 7(0) | -------------------------------------------------------------------------Predicate Information (identified by operation id): -------------------------------------------------------------------------5 - access("PRODUCTS"."PROD_SUBCATEGORY"='Jeans - Men') 7 - access("PRODUCTS"."PROD_CATEGORY"='Men') 19 rows selected.

Parse Tree
1 TABLE ACCESS BY INDEX ROWID BITMAP CONVERSION TO ROWIDS 2

BITMAP AND

BITMAP CONVERSION FROM ROWIDS INDEX RANGE SCAN PRODUCTS_PROD_ SUBCAT_IX

BITMAP CONVERSION FROM ROWIDS INDEX RANGE SCAN PRODUCTS_PROD_ CAT_IX

Ejemplos de AUTOTRACE

Iniciar la traza usando AUTOTRACE:

set autotrace on

Para esconder la salida de la instruccin

set autotrace traceonly

Mostrar nicamente el plan de ejecucin:

set autotrace traceonly explain

SQL*Plus AUTOTRACE: set autotrace traceonly statistics Statistics


SELECT * FROM products WHERE prod_category = 'Men' AND prod_subcategory = 'Jeans - Men';
Statistics ------------------------------------------------0 0 173 139 0 38030 741 24 0 0

recursive calls db block gets consistent gets physical reads redo size bytes sent via SQL*Net to client bytes received via SQL*Net from client SQL*Net roundtrips to/from client sorts (memory) sorts (disk)

La Herramienta SQL Trace


Se habilita a nivel de la instacia o sesin Recolecta estadsticas reales para las instrucciones SQL Produce una salida que debe formatearse usando TKPROF

Como usar la Herramienta SQL Trace


1. Fijar parmetros de inicializacin 2. Habilitar las trazas. 3. Ejecutar la aplicacin. 4. Desabilitar las trazas y darle formato a la traza. 5. Interpretar la salida.
Traza SQL Archivo de traza Archivo Reporte

TKPROF Base de Datos

Parmetros de Inicializacin
TIMED_STATISTICS = {false|true} MAX_DUMP_FILE_SIZE = {n|unlimited} USER_DUMP_DEST = directory_path

MAX_DUMP_FILE_SIZE medido en bloques del sistema de operacin Por defecto USER_DUMP_DEST se ubica en directorio de background dump.

Ejemplos de utilizacin de Herramientas

Optimizacin de Consultas

Pasos en la Optimizacin

Pasos en las operaciones del Optimizador


Evaluacin de las expresiones y condiciones. Transformacin de las condiciones Seleccin del enfoque del optimizador: reglas/costos Seleccin de los caminos de acceso Seleccin del Orden de Join Seleccin de los mtodos de join

Transformacin de las condiciones

Cost-based transformations.

IN->OR/JOIN Expansin del OR ORs ->UNION ALL. Concatenacin: OR, uso de ndices vs full table scan. ANY/SOME-> OR/EXISTS All->AND BETWEEN -> RANGE( y<= x and x=>z) Simplificacin del not: not a>b-> a<=b Transitividad (column1 comp_oper constant AND column1 = column2) -> (column2 comp_oper constant) Fusin de Vistas Reescrituras en funcin de Vistas Materializadas Transformacin Estrella Conversin del operador intersect en join y minus en antijoin

Caminos de Acceso

Full Table Scans Sample Table Scans Rowid Scans Index Scans Cluster Scans Hash Scans

Escogencia del mtodo de Join

Similar a lo descrito en teora:

Ineficiente para el manejo de gran cantidad registros. Se considera gran cantidad mas de10.000 registros.
costo = costo_acceso(A )+ (costo_acceso(B) * #registros(A))

CBO: hash join es definido como el ms eficientepara retornar gran cantidad de registros a large number or rows. costo = (costo_acceso(A) * #particiones_hash(B)) + costo_acceso(B) RBO: merge join se considera el ms eficiente para retornar gran cantidad de registros. costo = costo_acceso(A) + costo_acceso(B) + (costo_ordenamiento(A) + costo_ordenamiento(B))

Escogencia del Plan de Evaluacin

Consideraciones que aplican a los enfoques de basado en costos y basado en reglas:

El optimizador primero determina cuando el resultado del join entre dos o ms tablas retorna ms de un registro (UNIQUE y PRIMARY KEY). El optimizador ubica primero en el orden del join aquellas tablas que retornen un slo registro y luego optimiza el join del conjunto de tablas restantes. Outer joins: la tabla con el operador de outer join, debe venir despus de la tabla que aparece en la condicin join. El optimizador no considera joins que violen esa regla.

Escogencia del Plan de Evaluacin

El CBO genera un conjunto de planes de evaluacin segn posibles rdenes de join, mtodos de join y caminos de acceso disponibles. Luego estima el costo de cada plan y escoge aquel con menor costo. Los costos se estiman de la siguiente manera: El costo de una operacin de nested loops est basado en el costo de lectura de cada registro en la tabla outer y los de la tabla inner que hagan match. El optimizador estima esos costos usando las estadsticas del diccionario de datos. El costo del merge join se basa principalmente en el costo de la lectura de todos los registros en la memoria y su ordenamiento.

Escogencia del Plan de Evaluacin

El optimizador tambin considera otros factores en el momento de determinar los costos de cada operacin. Por ejemplo: Un rea de ordenamiento pequea incrementa el costo del merge join (SORT_AREA_SIZE).

Un gran contador de lecturas multibloque tiende a disminuir el costo de una operacin de sort merge join en relacin a nested loop join (DB_FILE_MULTIBLOCK_READ_COUNT).

Con el CBO, la escogencia del orden del join puede ser sobreescrita con el hint ORDERED. Si el hint ORDERED especifica un orden de join que viola la regla de un outer join, entonces el optimizador ignora el hint y escoge el orden. Se pueden sobreescribir las escogencias del optimizador mediante hints.

Optimizing SQL Statements

Mejor rendimiento

Tiempo requerido para completar una peticin. Adecuado para:


Procesamiento en batch Aplicaciones de reportes

Respuesta rpida

Tiempo requerido retornar primeros registros. Adecuado para:


Aplicaciones interactivas Aplicaciones Web o GUI.

Fijando el enfoque del Optimizador

Al nivel de la instancia:
OPTIMIZER_MODE = {CHOOSE|RULE|FIRST_ROWS_n|ALL_ROWS}

Para una sesin


ALTER SESSION SET optimizer_mode = {choose|rule|first_rows(_n)|all_rows}

Recomendaciones de los Hint

Use hints cuidadosamente porque implican alta carga de mantenimiento. Cuide el impacto en el desempeo de hardcoded hints cuando quedan invlidos.

Sintaxis de Ejemplo
SQL> 2 3 4 5 6 7 8 9 10 UPDATE --+ INDEX(p PROD_CATEGORY_IDX) products p SET p.prod_min_price = (select (pr.prod_list_price*.95) from products pr where p.prod_id = pr.prod_id) WHERE p.prod_category = 'Men' AND p.prod_status = 'available, on stock' /

Categoras de Hints

Enfoque de optimizacin y objetivos Caminos de Acceso Transformacin de Consultas Orden del Join Operador del Join Ejecucin Paralela Otros

Objetivos de Optimizacin y Enfoques


ALL_ROWS Selecciona el enfoque basado en costos con el objetivo de mejor desempeo Optimiza una instruccin individual SQL para su respuesta rpida Permite la seleccin de cualquiera de los enfoques: costos o reglas para una instruccin SQL. Forza el enfoque basado en reglas.

FIRST_ROWS(n)

CHOOSE

RULE

Hints para Caminos de Acceso


FULL ROWID INDEX INDEX_ASC INDEX_COMBINE Bsqueda completa en la tabla. Acceso a la tabla por ROWID Bsqueda ascendente en el ndice Bsqueda ascendente en el ndice Selecciona un bitmap como camino de acceso Selecciona una bsqueda hash para acceder a la tabla especificada.

HASH

Hints para Caminos de Acceso


INDEX_JOIN Usar index join como rutina de join. INDEX_DESC Uso de un ndice para la tabla especificada. INDEX_FFS Lleva a cabo fast full index scan NO_INDEX Deshabilida el uso de un conjunto de ndices. AND_EQUAL Combina ndices de una columna.

Hints para la Transformacin de Consultas


USE_CONCAT Rescribe el OR comoUNION ALL y deshabilita el procesamientoINLIST Previene expansiones OR Reescribe una consulta en funcin de una vista materializada Usada para consultas que contengan grouping sets Deshabilita la rescritura para un query block

NO_EXPAND REWRITE

EXPAND_GSET_TO _UNION NO_REWRITE

Hints para Transformacin de Consultas


MERGE NO_MERGE Fusiona una vista para cada consulta Evita la fusin de vistas.

STAR_ Seleccin de plan con TRANSFORMATION transformacin estrella. FACT NO_FACT Indica que la tabla ser tratada como una tabla de hechos Indica que la tabla no debe ser tratada como una tabla de hechos

Hints para el Orden del Join


ORDERED STAR El orden de join ser el especificado en la clusula FROM. Forza el uso de un plan de consulta estrella. Ms grande va de ltima.

Hints Operaciones de Join


USE_NL USE_MERGE Usa el operador fsico: nestedloop join Usa el operador fsico: sortmerge join

Hints para Operaciones de Join


USE_HASH LEADING HASH_AJ, MERGE_AJ, NL_AJ HASH_SJ, MERGE_SJ, NL_SJ Utiliza hash join como operador fsico Usa la tabla especificada como primera en el orden del join Transforma una subconsulta NOT IN en un anti-join Usa semi-join en lugar de EXISTS

Otros hints
APPEND NOAPPEND ORDERED_PREDICATES CURSOR_SHARING_ EXACT DYNAMIC_SAMPLING Habilita los INSERT con directpath Habilita INSERT regulares Forza a preservar el orden de evaluacin de los predicados Evita el reemplazo de literales con variables ligadas. Habilita dynamic sampling para mejorar el desempeo.

Ejemplos Optimizacin de Consultas

SELECT L_SHIPMODE, SUM(CASE WHEN o.O_ORDERPRIORITY = '1-URGENT' OR o.O_ORDERPRIORITY = '2-HIGH' THEN 1 ELSE 0 END) AS HIGH_LINE_COUNT, SUM(CASE WHEN o.O_ORDERPRIORITY <> '1-URGENT' AND o.O_ORDERPRIORITY <> '2-HIGH' THEN 1 ELSE 0 END) AS LOW_LINE_COUNT FROM CI531301.ORDERS o, CI531301.LINEITEM WHERE L_SHIPMODE IN ('AIR', 'TRUCK') AND L_COMMITDATE < L_RECEIPTDATE AND L_SHIPDATE < L_COMMITDATE AND L_RECEIPTDATE >= DATE '1995-01-01' AND L_RECEIPTDATE < DATE '1995-01-01' + INTERVAL '1' YEAR AND o.O_ORDERKEY = L_ORDERKEY GROUP BY L_SHIPMODE ORDER BY

Lineitem

L_shipmode tiene 7 valores distintos La condicin sobre l_shipmode retorna el 28,63% de las tuplas en la tabla L_receiptdate tiene informacin para 6 aos distintos Selectividad de la condicn para el rango de 1 ao: 100/6=15.2305036 l_commitdate<l_receiptdate retorna 63.20% Selectividad las 3 condiciones 5.21%. Selectividad todas las condiciones: 0.52%

Seleccin del orden de los atributos

Para evaluar l_commitdate es necesario conocer primeros los valores vlidos para l_receiptdate, si no habra que hacer full index scan. L_shipdate<l_commitdate es necesario conocer el l_commitdate para que filtre. ndice propuesto: (l_shipmode, l_receiptdate, l_commitdate, l_shipdate) Segunda propuesta: (l_shipmode, l_receiptdate, l_commitdate, l_shipdate, l_orderkey) Tercera propuesta: Tabla organizada por ndice

Orders

Indice (o_orderkey, o_orderpriority). Resulve la consulta sin consultar la tabla. o_orderkey va primero porque es el que se utiliza en el join, o_orpriority slo se proyecta

CREATE INDEX IDX1_ORDERS ON CI531301.ORDERS (O_ORDERKEY,O_ORDERPRIORITY);

CREATE TABLE LINEITEM ( L_SHIPMODE CHAR(10), L_RECEIPTDATE DATE, L_COMMITDATE DATE, L_SHIPDATE DATE, L_ORDERKEY NUMBER(10) NOT NULL, L_LINENUMBER NUMBER(6) NOT NULL, L_PARTKEY NUMBER(6) NOT NULL, L_SUPPKEY NUMBER(6) NOT NULL, L_QUANTITY NUMBER(12,2) NOT NULL, L_EXTENDEDPRICE NUMBER(12,2) NOT NULL, L_DISCOUNT NUMBER(12,2) NOT NULL, L_TAX NUMBER(12,2) NOT NULL, L_RETURNFLAG CHAR(1) NOT NULL, L_LINESTATUS CHAR(1) NOT NULL, L_SHIPINSTRUCT CHAR(25), L_COMMENT VARCHAR(44), CONSTRAINT PK_LINEITEM PRIMARY KEY (L_SHIPMODE,L_RECEIPTDATE,L_COMMITDATE,L_ SHIPDATE,L_ORDERKEY, L_LINENUMBER), CONSTRAINT FK_LINEITEM_PARTSUP FOREIGN KEY(L_PARTKEY, L_SUPPKEY) REFERENCES CI531301.PARTSUPPLIER) ORGANIZATION INDEX COMPRESS TABLESPACE TPC_DATA STORAGE(INITIAL 232M NEXT 116M PCTINCREASE 0) INCLUDING L_LINENUMBER OVERFLOW TABLESPACE CURSOS_DATA STORAGE (INITIAL 352M NEXT 176M PCTINCREASE 0);

Consulta Q12 Antes de la Modificacin


SELECT L_SHIPMODE, SUM(CASE WHEN o.O_ORDERPRIORITY = '1URGENT' OR o.O_ORDERPRIORITY = '2-HIGH' THEN 1 ELSE 0 END) AS HIGH_LINE_COUNT, SUM(CASE WHEN o.O_ORDERPRIORITY <> '1URGENT' AND o.O_ORDERPRIORITY <> '2-HIGH' THEN 1 ELSE 0 END) AS LOW_LINE_COUNT FROM CI531301.ORDERS o, CI531301.LINEITEM WHERE L_SHIPMODE IN ('AIR', 'TRUCK') AND L_COMMITDATE < L_RECEIPTDATE AND L_SHIPDATE < L_COMMITDATE AND L_RECEIPTDATE >= DATE '1995-01-01' AND L_RECEIPTDATE < DATE '1995-01-01' + INTERVAL '1' YEAR AND o.O_ORDERKEY = L_ORDERKEY GROUP BY L_SHIPMODE ORDER BY L_SHIPMODE

Consulta Q12 despus de la Modificacin


SELECT L_SHIPMODE, SUM(CASE WHEN o.O_ORDERPRIORITY = '1URGENT' OR o.O_ORDERPRIORITY = '2-HIGH' THEN 1 ELSE 0 END) AS HIGH_LINE_COUNT, SUM(CASE WHEN o.O_ORDERPRIORITY <> '1URGENT' AND o.O_ORDERPRIORITY <> '2-HIGH' THEN 1 ELSE 0 END) AS LOW_LINE_COUNT FROM CI531301.ORDERS o, CI531301.LINEITEM WHERE L_SHIPMODE IN ('AIR', 'TRUCK') AND L_COMMITDATE < L_RECEIPTDATE AND L_SHIPDATE < L_COMMITDATE AND L_RECEIPTDATE > DATE '1994-12-31' AND L_RECEIPTDATE < DATE '1996-01-01 AND o.O_ORDERKEY = L_ORDERKEY GROUP BY L_SHIPMODE ORDER BY L_SHIPMODE

Resultados
CPU vs. Ao
16 14 12 10 8 6 4 2 0 1993 1994 1995 1996 1997 1998 Ao

Cpu Opt Cpu Prop Cpu Original

CPU

Nmero de Bloque vs. Ao


Nmero de Bloques 70000 60000 50000 40000 30000 20000 10000 0 1993 1994 1995 1996 1997 1998 Ao Bloques Opt Bloques Prop Bloques Original

Referecias

Oracle Database Data Warehousing Guide. 10g Release 2 (10.2). Part Number B14223-02 18 Advanced Query Rewrite http://download.oracle.com/docs/cd/B19306_ 01/server.102/b14223/qradv.htm#sthref1357 Oracle Database Performance Tuning Guide. 10g Release 1 (10.1). Part Number B10752-01 http://download.oracle.com/docs/cd/B14117_ 01/server.101/b10752/optimops.htm#76331

Das könnte Ihnen auch gefallen