Optimizar is null en Oracle

Viendo el explain plan o plan de ejecución de una consulta en Oracle, podemos llegar a ver el caso en el cual se está haciendo un recorrido FULL a una tabla, la cual se está filtrando en la consulta mediante un IS NULL sobre uno de sus campos. En estos casos, puede convenir el optimizar is null. Sobretodo si la tabla es muy grande y está penalizando la ejecución de la consulta al hacer el FULL.

Solución y explicación para optimizar is null

Una posible solución sería crear un índice compuesto sobre esa tabla y ese campo, añadiéndole un cero. Tal que así:

create index idx_table-column-nulls on table(column-nulls, 0)

Este índice es especial y está pensado para los casos en los cuales tenemos búsquedas por campos is null. Al crear un índice del tipo TABLA (CAMPO,0) lo que hace es que indexa el valor, pero cuando este es nulo, lo crea como un 0 (en el índice, no lo guarda así en la tabla). De esta forma, el optimizador al buscar por NULL lo transforma en CAMPO = 0.

Con esto suele funcionar y quedar optimizado para estos casos, aunque no estaría de más comprobarlo. Esto es debido a que puede haber casos en los cuales no sea óptimo poner un 0 y sería mejor poner otro valor. Por ejemplo, si se trata de un caso en el cual el campo muchas veces tiene valor 0. En este caso no sería óptimo, al modificar el comportamiento del índice y complicar el diferenciar los nulos de los ceros en la tabla.

Es de alguna manera, usar el isnull de Oracle, donde se aplica si es null poner 0, pero sin aplicarlo a la tabla, sólo al índice.

Deja un comentario

Pin It on Pinterest