Los hints son parametros que pasamos a las sentencias SQL para influir en el optimizador de oracle.
SELECT /*+ HINT */ . . .
Toda consulta SELECT se ejecuta dentro del servidor en varios pasos. Para la misma consulta, pueden existir distintos caminos para conseguir el mismo resultados, por lo que el servidor es el responsable de decidir qué camino seguir para conseguir el mejor tiempo de respuesta.
La parte de la base de datos que se encarga de estas decisiones se llama Optimizador. El camino seguido por el servidor para la ejecución de una consulta se denomina "Plan de ejecución" (ver EXPLAIN PLAN).
Hay que tener en cuenta que:se basa en las reglas básicas, pero teniendo en cuenta el estado actual de la base de datos. Es decir, tiene en cuenta el número de registros de las tablas, el número de usuarios accediendo a ellas, etc. Por ejemplo, si se hace una consulta utilizando un campo indexado, mirará primero el número de registros y si es suficientemente grande entonces merecerá la pena acceder por el índice, si no, accederá directamente a la tabla.
Para averiguar el estado actual de la base de datos se basa en los datos del catálogo público, por lo que es recomendable que esté lo más actualizado posible (a través de la sentencia ANALYZE), ya que de no ser así, se pueden tomar decisiones a partir de datos desfasados (la tabla tenía 10 registros hace un mes pero ahora tiene 10.000).
Oracle recomienda que todas las consultas se hagan por costes, aunque hay ciertos casos en los que una consulta no se resuelve (o tarda mucho) por costes y por reglas es inmediata. ¿Y cómo hacer que una consulta se ejecute por reglas o por costes? Pues hay dos modos de forzar a Oracle a que utilice un optimizados.
La primera es modificando la sesión activa para que todas las consultas sean optimizadas de una manera:
ALTER SESSION SET OPTIMIZER_GOAL = [RULE|CHOOSE];
/*+ ALL_ROWS */ Pone la consulta a costes y la optimiza para que consuma el menor número
de recursos posibles.
/*+ FIRST_ROWS */ Pone la consulta a costes la optimiza para conseguir el mejor tiempo de
respuesta.
/*+ CHOOSE */ Pone la consulta a costes.
/*+ RULE */ Pone la consulta a reglas.
/*+ INDEX( tabla índice ) */ Fuerza la utilización del índice indicado para la tabla indicada
/*+ ORDERED */ Hace que las combinaciones de las tablas se hagan en el mismo orden en
que aparecen en el join.