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:


Acciones

Información

7 respuestas

19 09 2007
favio

Gracias, por tus post, desde hace un tiempo encontre tu blog y siempre es interesante leer informacion que no sea la tipica que presentan en casi todas las paginas (puros conceptos), si no conocer informacion que no te la da ningun libro, pagina web o tutorial que es la que se gana con la experiencia.

Saludos y sigue adelante

19 09 2007
Adrian

Hola Favio,

de nada. Es un placer compartir estas experiencias con todos ustedes.

Recibe un saludo
Adrian

25 09 2007
Encuestas y promedios « Haciendo Cubos

[...] A diferencia de las ventas donde los nulos desaparecen la venta más grande que exista, en las encuestas es necesario usar nulos en los cubos. Esto se debe a que los valores nulos no son tomados en cuenta para el promedio: [...]

9 07 2009
Pedro sanchez

yo recuerdo que en una ocasion a un cliente le dije que le pusiera NULL en una columna y en lugar de hacer:
update Tabla set columna = NULL le puso:
update Tabla set columna = ‘NULL’ ( con comillas como si fuera texto )
si vieras lo que me tarde en resolver el misterio porque cuando le daba select a la tabla yo veia ‘NULL’, pero nunca pesnse que fuera un texto

15 07 2009
gaugald

El nulo (de ser aplicado en un número moderado de medidas) puede ser tratado con ceros más un campo de marca de tipo dummy (boolean). La idea es que en el OLAP al minuto de quitar las cosas para el AVG se utilice este atributo dummy y así promediar con los elementos que valen la pena.

Ahora bien para los casos en que no se pueden transponer un conjunto de medidas de columnas a filas y la cantidad de medidas es algo escandalosa el cero y el nulo pueden significar para el negocio algo totalmente diferente. Por ejemplo nulo es que el evento no ocurrió y el cero que si ocurrió, pero no reportó un valor. Finalmente, este es un dolor de cabeza que el arquitecto del DWH tendrá de por vida y más aún cuando está la dualidad de los puristas/preciosistas vs lo bueno…

15 05 2011
Bunny

Great common sense here. Wish I’d toguhht of that.

16 05 2011
zhtgcda

R51N2c yurmaxjtnubc

Deja un comentario

Fill in your details below or click an icon to log in:

Logo de WordPress.com

You are commenting using your WordPress.com account. Log Out / Cambiar )

Twitter picture

You are commenting using your Twitter account. Log Out / Cambiar )

Facebook photo

You are commenting using your Facebook account. Log Out / Cambiar )

Connecting to %s




Seguir

Get every new post delivered to your Inbox.