Ceros y Nulos en un data warehouse

19 09 2007

Una de la grandes lecciones aprendidas una y otra vez, proyecto tras proyecto, es el uso correcto de ceros y nulos en el datawarehouse. El principio es sencillo e importante conocer:

5548+ nulo = nulo

No importa lo que pongas el resultado se anula. Una o dos veces al principio me ocurrió que llenaba los cubos o estrellas y al tratar de sacar el total de ventas con un

select sum( ventas ) from HechosComercial

obtenía como resultado nada. Se platica sencillo pero lo que en realidad ocurría era:

—¿cuánto tiempo falta para que termine la carga?
—una hora…
—¿a que horas es a la presentación a dirección?…tenemos que darle una revisada rápida a las pantallas
—dentro de 2 horas
—tiempo suficiente.

Una hora después…

— ya terminó la carga, a ver, revisa las pantallas.
— ¡las pantallas están vacías! No se cargó la información, %&/%#…¿falló algo?
— No, todo está bien. Los logs no marcan errores e incluso las tablas tienen información
Confused
— A lo mejor definiste mal los indicadores, revisa la definición
— …está todo bien
— ¿no será que usaste el indicador equivocado? hay que revisar las pantallas.
— …No, todo es correcto.
— ¿y si la haces de nuevo?
—…ya la hice de nuevo sigue igual..¿cuanto falta?
— 15 minutos…

Más tarde y después de cancelar la presentación o de haber arruinado el buen humor de la junta de resultados resulta que encontramos el query:

select sum( ventas ) from HechosComercial

— No entiendo, si ejecuto la consulta me regresa un nulo. Ya revisé cada uno de los totales por región. Saque el detalle, lo exporté a excel e hice los cálculos. Coinciden perfectamente.
—¿no será un bug de la base de datos?
—Yo creo que sí.
—Voy a buscar algo en google…

Así, después de horas y horas finalmente descubrimos que un registro con el valor de la columna ventas igual a nulo era el causante de todo. 2 millones 354 mil registros de información y un mendigo registro con el valor de nulo echa a perder todo.

A partir de entonces como procedimiento normal de la carga, sustituimos todos los nulos por un cero o en su defecto uso un desagradable sum( isnull( Ventas,0)). También en el create table en la definición de las columnas ponemos un default de cero.

Alguien pudiera pensar…»sencillo, en el where ponle Ventas is not null» pero con millones y millones de registros estoy seguro que sentaríamos el servidor al obligarlo a recorrer registro por registro toda la estrella para discriminar aquellos registros con nulos. No se les ocurra indexar las columnas-indicadores para acelerar la busqueda. Sería una barbaridad.

No siempre usamos cero, a veces en ciertos casos hemos tenido que dejar los nulos por algún requerimiento del indicador. Todo depende.

Al menos una vez al año recibimos alguna llamada de una persona desesperada por que las pantallas no muestran información y con un «pero las tablas si están llenas». Eso quiere decir que ocurre a menudo. ¿A alguien le ha pasado algo parecido?

Technorati tags: