Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Preparado para
DGIC-SSEAF
Por Excelsis.
Setiembre, 2010
1
Contenidos
................................................................................................................................................1
Objetivos 3
Especificando Hints 7
2
Objetivos
3
Entendiendo los Optimizer Hints.
Los hints le permiten tomar decisiones que normalmente son hechas por el optimizador. Como el diseñador de su
aplicación, usted puede conocer información acerca de sus datos que el optimizador desconoce. Los hints proveen
mecanismos que pueden instruir al optimizador a elegir ciertos planes de ejecución basados en criterios específicos.
Por ejemplo, usted puede saber que cierto índice es más selectivo para ciertas consultas. Basado en ésta información
usted puede elegir un plan de ejecución mas efectivo que el optimizador. En ese caso, use los hints para instruir al
optimizador a usar el plan de ejecución más óptimo.
4
Especificando alguno de los hints citados, indican al optimizador elegir un camino especifico sólo si dicho camino
está disponible, basado en la existencia de un indice o cluster y en la construcción sintactica de la sentencia SQL. Si
el hint especifica una ruta de acceso que no está disponible, el optimizador simplemente ignora dicho hint.
5
Aditional Hints
APPEND
NOAPPEND
CACHE
NOCACHE
PUSH_PRED
NO_PUSH_PRED
PUSH_SUBQ
NO_PUSH_SUBQ
QB_NAME
CURSOR_SHARING_EXACT
DRIVING_SITE
DYNAMIC_SAMPLING
MODEL_MIN_ANALYSIS
6
Especificando Hints
Los hints aplican sólo en la optimización del bloque de la declaración en donde ellos aparecen. Un bloque de
declaración es cualquiera de los siguientes declaraciones o parte de declaraciones:
Por ejemplo, un consulta compuesta de dos queries combinados por un opeador UNION, contiene dos bloques, uno
por cada query. Por ésta razón los hints en la primera consulta, sólo trabajarán en la optimización de ésta, no siendo
así para el segundo bloque.
7
WHERE e2.department_id =
e1.department_id )
GROUP BY e1.first_name, e1.last_name, j.job_id
ORDER BY total_sal;
Luego de correr el EXPLAIN PLAN para la consulta, en el plan table output, se puede determinar el
identificador del para el query block generado por el sistema.
Por ejemplo, el nombre del query block es mostrado en el siguiente plan table output:
-------------------------------------------------------------
...
10 - SEL$4 / E2@SEL$4
Luego de determinar el nombre del query block, el mismo puede ser usado en la siguiente consulta SQL:
*
FROM v;
8
Verificación de Hints usados actualmente por el
Ministerio de Hacienda.
En base a los resultados de los scripts de búsqueda de los hints, los que están implementados en las declaraciones
SQL de sus sistemas que pudimos encontrar son los siguientes:
INDEX: Indica al optimizador a utilizar un índice especifico para la búsqueda en una tabla. Éste hint puede ser
utilizado para los tipos de índices: function-based, domain, B-tree, bitmap y bitmap join.
SELECT /*+ INDEX (employees emp_department_ix)*/
employee_id, department_id
FROM employees
WHERE department_id > 50;
ORDERED: Indica a Oracle a realizar el join de las tablas en el orden en que aparecen en la cláusula FROM.
Cuando se omite el hint ORDERED desde una sentencia SQL que necesita join, el optimizador elige el
orden en el join de las tablas.
SELECT /*+ORDERED */ o.order_id, c.customer_id, l.unit_price * l.quantity
FROM customers c, order_items l, orders o
WHERE c.cust_last_name = :b1
AND o.customer_id = c.customer_id
AND o.order_id = l.order_id;
INDEX_FFS: Indica al optimizador a realizar un fast full index en vez de un full table scan.
SELECT /*+ INDEX_FFS(e emp_name_ix) */ first_name
FROM employees e;
USE_HASH: Indica al optimizador a realizar un join de una tabla con otra usando HASH_JOIN.
SELECT /*+ USE_HASH(l h) */ *
FROM orders h, order_items l
WHERE l.order_id = h.order_id
AND l.order_id > 3500;
USE_HASH_SJ: Insertado dentro de una subquery de tipo EXISTS; convierte la subquery en un tipo especial de
hash join entre la tabla1 y tabla2 que preserva la semantica de la subquery. Es decir, incluso si hay más de una fila
coincidente en tabla2 de una fila en tabla1, la fila en tabla1 se devuelve sólo una vez.
Recomendación: El uso de los Hints citados arriba mantienen su uso y definición para la versión 10g de la
base datos, siguiendo la misma sintaxis e implementación que en la versión 9i.