Llaves surrogadas o sustitutas.

12 06 2008

image

Esta es una de las buenas prácticas que a mi juicio muchas veces se omiten en el diseño de un data warehouse. Las llaves surrogadas o sustitutas son una llave generada artificialmente y que viene a sustituir el campo llave de la dimensión.

Para ponerlo en bits y bytes, lo que hacemos es diseñamos la tabla de tal forma que la llave primara sea un campo con un tipo de dato entero y que además tenga la propiedad “autoincrement” ( o identity, o lo que sea, todo depende de la base de datos utilizada). En la tabla existe un campo que servirá para almacenar la llave original. Al llenar la tabla se generarán valores numéricos que usaremos en vez del campo clave original.

Las ventajas son muchas. Para mí la principal es mejorar el tiempo de respuesta de la base de datos ya que buscar entre números enteros es lo que menos trabajo le cuesta a la base de datos; pero también hay otras, por ejemplo, si estamos juntando en un data warehouse información de sistemas transaccionales diferentes y cada uno de ellos tienen llaves que no se parecen en nada la una de la otro, las llaves surrogadas o sustitutas nos permitirán tener una llave homogénea para ambos sistemas.

Nos permite también resolver cosas como por ejemplo mantener la historia en el tiempo y a la vez separarla. Por ejemplo si queremos que un vendedor que ahora pertenece a otra región, su historia se conserve en el data warehouse en la región original, lo que hacemos es crear un nuevo registro en la tabla de vendedores con una nueva llave sustituta para ese vendedor y usamos esa nueva llave para almacenar las ventas de ese cliente a partir de la fecha que el movimiento ocurre. De esta forma en el data warehouse tendremos las 2 cosas.

IdVendedor CveVendedor Vendedor Región
2345 A00X456 Miguel Gutierrez Norte
 
5467 A00X456 Miguel Gutierrez Centro

Si queremos la historia del vendedor podemos hacer la consulta por el # de Vendedor lo cual abarcará a las 2 llaves (la nueva y la antigua).

select sum(ventas)
from HechosVentas A
join DimVendedores B on a.idVendedor = b.IdVendedor
where b.CveVendedor = ‘A00X456′

Si queremos las ventas de cada región:

select region, sum(ventas)
from HechosVentas A
join DimVendedores B on a.idVendedor = b.IdVendedor
group by region

El modelo por sí solo lo resolverá.

Surrogadas

Por cierto, en el modelo arriba mostrado (que no tiene nada que ver con el ejemplo de regiones y vendedores que les daba) pueden ver que yo por ejemplo a todas las llaves usrrogadas las identifico por el sufijo “ID” y para los campos llaves originales reservo todos los campos con el sufijo “cve”.

¿implica más trabajo? Si, así es. Muchas veces por falta de tiempo yo en mi caso las omito. También en cierto que hay diferentes maneras de generarlas por ejemplo con algún ETL. Los beneficios son muchos así que cada vez que diseñe un modelo, ponga en la balanza los beneficios que le pueda traer el incluir dichas llaves.

Por cierto, si vá a utilizar el “count distinct” estas llaves sustitutas les vienen como anillo al dedo.





El factor humano

9 06 2008

Realmente no sabía como titular este post y aún no lo sé. Esta vez la cosa no tiene que ver con cubos sino con las personas.

En esto de ser consultor muchas veces hay que decir muchas cosas… ¿cómo decir que no?¿cómo decirle a un cliente que me he equivocado o qué a lo mejor él está en un error?¿cómo debo de contestarle a un cliente?¿cuál es la mejor manera?¿cómo dar una mala noticia?¿como escuchar?¿mi proyecto está fracasando por las peleas o envidias en el equipo?¿cómo ganar una discusión?¿debo de llamarle la atención a alguien?

¿cómo debo manejar esa situaciones para los que nadie nos preparó y para las que no hay respuestas en MSDN, OTN o Google?

Conozco un libro: “Como ganar amigos e influir sobre las personas” de Dale Carnegie que a mí en lo particular me ha sido de gran ayuda para  esas situaciones. Este libro me ha enseñado (pero que no aprendido) que algunas veces es mejor comenzar la semana preguntándole al cliente como van sus pequeños en la escuela que como va el proyecto.

comoganar1 

Uno no se puede explicar por qué nadie enseña estas cosas en la escuela

Es un gran libro. Se los recomiendo.





Deshabilitando el drill down por usuario

3 06 2008

Algunas veces se requiere deshabilitar el drill down a un usuario. Podrá ver los escenarios o tableros de control pero no queremos que navegue en la información. Para hacer esto en la sección de seguridad de Artus Administrator localizamos el usuario que deseamos restringir, le damos doble click y deshabilitamos el drill down.

EnablingDrillDown

Hay que hacerlo en 2 secciones. La primera deshabilita la expansión de los renglones en las tablas. El segundo deshabilita el drill downn o análisis empresarial a nivel celda.





Notación BI

30 05 2008

Todavía existo y me la he pasado documentando.

Hay muchas cosas que podemos platicar acerca de la documentación pero de todas ellas siempre me llama la atención lo difícil que es documentar procesos en un data warehouse. Hay que describir paso por paso las cosas por ejemplo “…el presupuesto total se multiplica por el % de participación de los productos dentro de cada cliente…”, “el desglose de las ventas por cliente” o algo así (además de dibujar el respectivo diagrama para respaldar las palabras).

Confieso que soy ingeniero en otra cosa y de sistemas no estudié nada. Pero eso sí vimos matemáticas y matemáticas a lo bestia y si algo era fácil ahí era describir algo con simples símbolos. Así que para facilitarme la vida me he atrevido a proponerles estas cosas.

Para representar una métrica desglosada por una dimensión podemos usar

image

Donde el indicador es ventas y el subíndice Cliente representa la dimensión por la que se desglosa la métrica.

image

De esta forma podemos representar un porcentaje de participación. Las Ventas desglosadas por cliente dividido entre el total de ventas me dá como resultado con cuanto participa cada cliente en el total. Si el indicador no lleva subíndice representa el total de la métrica.

Mientras documentaba requería representar el % de participación que tienen los productos dentro de cada cliente.

image

Al usar un subíndice compuesto puedo representar un desglose por 2 dimensiones (lado derecho). En el lado izquierdo léase como el desglose del % de participación por producto dentro de cada cliente (que no es lo mismo que el simple % de participación por producto).

Un prorrateo donde el presupuesto se tiene a nivel región pero hay que explosionarlo a nivel producto (SKU) utilizando la historia existente en el datawarehouse me quedó:

image

Mientras más le rasco más útil me parece y más sencillo se me ha hecho documentar. Claro, hay mil cosas para donde irse …¿…como represento Ventas año pasado?¿las ventas del último periodo antes del cierre? Tampoco soy un experto y habría que resolver las distintas interpretaciones que diferentes personas les damos a a las cosas

¿ustedes que piensan?¿será útil?¿alguien conoce algún método parecido y me estoy inventado el hilo negro y complicando la vida?¿será mejor usar el método de las bolitas y de los cuadritos?

Por lo pronto creo que me urge el fin de semana… Nerd





¿Qué es una dimensión?

19 05 2008

Es aquello por lo que podemos desglosar un indicador o métrica.

Picture1

Algunas herramientas permiten crear dimensiones con múltiples niveles, otras dimensiones virtuales, otras con padres e hijos, otras de solo un nivel (etc., etc.) pero todas ellas para propósitos prácticos sirven para la misma cosa: para desglosar el indicador.

Algunos ejemplos de dimensiones pudieran ser: tienda, departamento, familia y producto si estamos hablando de un cubo de ventas supermercados. Departamento, puesto y empleado si estamos hablando de un cubo de recursos humanos. Cuenta, centro de costos y empresa para un cubo de finanzas.

Por desglosar no me refiero a por ejemplo desglosar el Margen en Ventas – Costo – Gastos (ventas menos costo menos gasto). NO, eso es descomponer un indicador o métrica en otros indicadores. Más bien se refiere a los cortes o agrupaciones en la información para dicha métrica.





Optimizando el tiempo de respuesta de Microsoft Analysis Services con Artus

7 05 2008

Hoy por la mañana revisábamos un indicador en Microsoft Analysis Services (AS) cuyo tiempo de respuesta al desglosarlo a nivel cliente era de varios minutos; finalmente lo dejamos en segundos.

La fórmula de dicho indicador era como esta:

iif( [Measures].[Ventas] = 0,0,1- ([Measures].[Ventas]/[Measures].[Costo])

La fórmula regresa un cero para todo aquello cuyo costo es cero. Cuando Artus lee el resul set que mostrará, por default se trae todos los valores NON_EMPTY (así es como le solicita los registros a AS: NON EMPTY). Para la fórmula anterior si el costo es cero la fórmula devuelve un cero; cero es NON_EMPTY por lo tanto AS lo incluye en el result set y Artus lo lee.

Por otra parte, Artus por default solo muestra aquellos valores del indicador que no son cero, hay que en propiedades de la tabla activar Mostrar Ceros.

¿Qué es lo que estaba pasando? Que el indicador tenía miles de registros con valor cero que como quiera se estaban calculando y además Artus los estaba leyendo, como por default no los mostraba (los ceros) nunca nos dábamos cuenta.

Dándonos cuenta de lo que estaba pasando, modificamos el indicador:

iif( [Measures].[Ventas] = 0,NULL,1- ([Measures].[Ventas]/[Measures].[Costo])

Al devolver un NULL, los AS toman este valor como EMPTY  por lo que no se incluye en el result set y además Artus no lo lee. Resultado, ahora AS preparaba un result set mucho más pequeño (lo que le toma menos tiempo y menos memoria) y Artus solo lee los 10 o 20 registros con valor.

El tiempo de respuesta quedó en segundos.

Otro método para obtener lo mismo, es clic derecho sobre el cubo y en preferencias activar excluir ceros y nulos. Este método de “por la fuerza bruta” activa esto a nivel cubo.

ExcluirCeros

Es mejor el primer método que este segundo. Por que este es global y ocultaría los ceros para todos los indicadores.





¿lo pongo en la tabla de hechos?

6 05 2008

image

Muy a menudo las personas se hacen esta pregunta al tratar de decidir que es más rápido y/o conveniente para los indicadores calculados, por ejemplo para el siguiente indicador:

Precio Promedio = Ventas / Unidades

No hay que perder de vista que si ponemos un indicador en la tabla de hechos, tendremos que usar una fórmula de agregación para obtener el valor. En el caso de las ventas tendríamos:

select sum(ventas) from HechosVentas

Si el precio promedio lo calculo y lo almaceno en la tabla de hechos para leer su resultado tendría que usar una fórmula de agregación. El precio promedio es un indicador que me dice en promedio a cuanto vendí cada unidad por lo que si quiero obtener el precio promedio global debiera utilizar:

select avg(PrecioPromedio) from HechosVentas

El average es el promedio aritmético y tiene el problema que le da el mismo peso a las ventas pequeñitas que a las grandes, en otros palabras el valor se distorsiona demasiado. Lo mejor sería usar:

select sum(ventas)/sum(unidades) from HechosVentas

Así como ven, guardar este indicador en la base de datos hace que se distorsione mucho el valor por lo que no es conveniente calcularlo y almacenarlo en la base de datos. Hay otros tipos de calculos en donde si es posible y hasta conveniente almacenarlo. Tome en cuenta todas estas posibilidadades al momento de decidir si materializará físicamente el indicador en una columna de la tabla de hechos o le conviene más crear un indicador lógico.





Ejecutando un análisis empresarial con un enlazador

5 05 2008

Es posible mandar a llamar un análisis empresarial o navegación flotante desde un enlazador. Primero necesitamos obtener la navegación flotante por ejemplo esta:

Enlazador1

Una vez que la tenemos en la pantalla ahora ponemos un enlazador en el escenario (no cierre la consulta, solo muévala ade lugar un poco mientras coloca en enlazador en el escenario); dé click derecho sobre en enlazador

Enlazador2

y seleccione “guardar análisis empresarial”

Enlazador3

Oprima aceptar y listo. Ahora en enlazador abrirá la consulta al darle un click. Recuerde que en el diseñador tiene que darle 2 click para que funcione no así en Artus Desktop. Si desea que la consulta reciba como parámetro el filtro de tiempo o los filtros de dimensión que están en el escenario, estos filtros deben de sincronizar al enlazador





¿Cuantas dimensiones puede tener un cubo?

24 04 2008

muchasdimensiones

Muchas veces me han preguntado esto ¿los cubos tienen un límite de dimensiones? Dependerá del software que utilice para hacer los cubos.

Tal vez el punto debiera ser ¿necesitamos tantas dimensiones? Lo que he visto en la práctica es que demasiadas dimensiones confunde y deja inservible el modelo. Hay que ser todo un experto en el diccionario de datos para saber que la dimensión 423 (llamada Depto E. por que ya nos acabamos todas las combinaciones de Depto.) es la que necesitamos ¿podrá tomar el usuario una decisión válida si no está seguro que el desglose de la información que está viendo a lo mejor no es correcta?

Por otro lado pocas dimensiones nos dejarán con el deseo de profundizar mas en el asunto.

dimensionesLos modelos de dirección para ser prácticos deben de andar entre 10 y 30 dimensiones. Mas 30 dimensiones y el modelo será operativo y difícil de dominar. En mi opinión creo se debería evaluar quien será el usuario del modelo y a partir de ahí determinar el # de dimensiones que será conveniente para dicho usuario.

No quiere decir que no se pueda (tener muchas dimensiones); se puede y muchas veces se tiene y se debe de hacer. Si es de los que tiene dimensionitis, puede agrupar las dimensiones para que al hacer drill down las dimensiones estén agrupadas según a la entidad que pertenecen (por ejemplo agruparlas por producto, por cliente, etc.)

Bueno, pero que mejor que todos para determinar que es mejor: ¿cuantas dimensiones has usado en promedio?¿ Te han funcionado? ¿te ha funcionado bién con muchisimas dimensiones?¿el usuario? ¿cual es el # máximo de dimensiones que has usado?¿cual es el tiempo de respuesta?¿cuál ha sido tu experiencia?…

Por cierto, en nuestro caso (Artus) se ha eliminado el límite de dimensiones que se pueden tener…

Liar

…ok, ok, dado que cla_descrip es un int, soportamos entonces 2,147,483,647 dimensiones, ese es el límite.





Creando Tabs con Artus

21 04 2008

Tabs

En Artus se pueden crear TAB usando el component Enlazador o el Gif, solo hay que seleccionar la opción TAB en el enlazador

CrearTabs

Para cada enlazador debe de seleccionar una imagen apropiada, dependiendo si en Tab va a estar encendido o apagado. Estas 2 imágenes pueden ser de gran utilidad

Tab-azul-01 Tab-azul-02

Deberá seleccionar que objetos se esconderán y cuales se activarán al darle clic al enlazador.

TabDefault

Por cierto, es importante activar al menos uno como default. El que tenga esta opción activada será el activo por default al consultar el escenario.








Seguir

Get every new post delivered to your Inbox.