domingo, 20 de enero de 2008

Hints Avanzados en PL/SQL

Chiste en hints avanzados en PLSQL, SQL y PL/SQLHints avanzados en PL/SQL para forzar la forma de acceder a una tabla

Ya he hablado anteriormente acerca de los hints PLSLQ mas comunes (FULL, ROWID, INDEX, NO_INDEX) para forzar el metodo de acceso a una tabla Oracle. En este artículo voy a presentar algunos hints más de este tipo, que se utilizan menos frecuentemente, pero no por ello menos útiles.


CLUSTER (nombre_de_tabla): Fuerza el accesso a la tabla indicada utilizando un índice de tipo cluster. Los índices de este tipo se utilizan para localizar registros que comparten valores comunes de una forma rápida. La clave del índice cluster puede estar constituida por una o más columnas de la tabla. Los registros de la tabla son agrupados según la clave y almacenados físicamente juntos en el disco duro.

Es decir, suponiendo que tenemos una tabla de empleados, si definimos un índice cluster basado en el país del empleado, cuando un usuario inserta un nuevo empleado, el índice cluster asegura que el nuevo empleado se almacene en el mismo bloque de datos donde figuran los empleados correspondientes a ese país.

Nota: Pueden definirse clusters en los que se almacene más de una tabla. Obviamente la única limitación es que dicho cluster se defina sobre columnas con valores comunes.

HASH (nombre_de_tabla): Fuerza a que la tabla se combine utilizando un algoritmo de hash. Sólo aplica a los clusters tipo hash que utilizan una función hash para calcular la localización de los registros de una tabla Oracle. En este caso, los registros son almacenados en el disco duro según sea el valor devuelto por la función hash. La función se utiliza para localizar los registros sin necesidad de utilizar el tiempo de entrada/salida o de CPU que requiere la búsqueda a través de un índice normal.

La unión de tablas a través de un cluster hush es recomendable para tablas con un gran número de registros ya que, para dichas tablas, los índices pueden estar estructurados en mucho niveles, siendo el acceso al índice más lento.

HASH_AJ (nombre_de_tabla): Transforma una subquery NOT IN en una anti-unión de tipo hash.

Una anti-únión (anti-join) es una forma de unir tablas que utiliza una lógica inversa. En vez de devolver registros cuando ambas partes cumplen con una condición, una anti-unión devuelve aquellos registros de una de las partes que no están en la otra (exactamente lo que hace una subquery NOT IN).

Nota explicativa: Una subquery no es más que una sentencia SELECT que está dentro de otra sentencia SQL o PL/SQL.