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];Con esto todas las consultas se ejecutarán utilizando el optimizador indicado. La otra manera es forzando a Oracle a que utilice un optimizador en una consulta concreta. Esto se hace a través de los “hits” o sugerencias. Un hint es un comentario dentro de una consulta SELECT que informa a Oracle del modo en que tiene que trazar el plan de ejecución. Los hint deben ir junto detrás de la palabra SELECT: A continuación se muestra una lista de algunos de los hints posibles:
/*+ 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.
Explicación de la sintaxis utilizada para los comandos: Las palabras en mayusculas son comandos de oracle. Las palabras en minusculas son opiones modificables Las partes enmarcadas con [] son opcionales Las palabras en negrita son las opciones por defecto Las partes enmarcadas con {} son alternativas (una u otra). El simbolo | indica OR