10 junio 2009

Implementando dimensiones SCD2 con SQL Integration Services (SSIS)

Desde hace un par de semanas he estado envuelto en una nueva iniciativa de Microsoft llamada SnackTI, la cual busca crear nuevo contenido y de alta calidad, relevante para estos tiempos de nuevos retos.

De acuerdo a esto me animé a contribuir en el área de Business Intelligence y lo siguiente fue pensar en qué tema escoger. Como ven el título de este post, me decidí por mostrar algunas mejores prácticas de cómo implementar “dimensiones lentamente cambiantes” ó slowly changing dimensions (SCD2), ya que en mis primeros años trabajando con Data Warehouses, este fue uno de los temas más interesantes, no sólo por el concepto en si, sino en buscar una forma optima de implementarlas en SSIS.

Por ello he creado una serie de screencasts (casi 90 minutos en total) que muestran en detalle dos formas de implementar dimensiones SCD2. Al final tuve que partir los screencast en varios videos de aproximadamente 10 minutos cada uno para poder publicarlos en YouTube.

Implementando SCD2 con SSIS - Parte I

En esta primera parte explico el problema que busca atacar el uso de SCD2 y explico cómo funciona su procesamiento de manera lógica. El demo de esta parte presenta la forma de implementar un paquete de SSIS para manejo de SCD2 usando el SCD Transformation, el componente “out ot the box” que viene en SSIS para implementar este tipo de casos.

Implementando SCD2 con SSIS - Parte II

La segunda parte se enfoca en demostrar una forma alternativa (y sugerida) de implementar el manejo de SCD2 para dimensiones con “muchos” miembros de datos y de esa forma bajar los tiempos de ejecución del paquete versus el SCD Transformation. La forma alternativa (personalizada) usa básicamente el Merge y Split Transformation para el manejo de la discriminante que decide si el miembro en proceso es una actualización o una inserción, y; una tabla temporal y un SQL Transformation para la ejecución de la actualización en batch (por lotes) en la base de datos.

 

 

Incluyo a continuación una comparación entre los tiempos de ejecución de la primera y segunda carga de las dos formas la cual resumo a continuación:

  SCD Transformation SCD Personalizado
Primera carga

20.732 Sec.

0.999 Sec.

Segunda carga

1:04:756 Min.

1.248 Sec.


Los resultados salen a la vista. La opción personalizada es mucho más rápida en el procesamiento. Cabe resaltar que no se aplicó ninguna optimización adicional al uso directo de los paquetes..

Pueden descargar ambas versiones de los paquetes, los archivos de backup de las 2 bases de datos usadas (SQL 2008) y la  versión PDF de la presentación, desde aquí:

No olviden truncar la tabla DimCustomer en la base de datos SCDDemo_DW cuando empiecen a hacer sus pruebas.

Alan.

5 comentarios:

Jose J dijo...

Excelente blog!!! Claro y preciso!

Pregunta, Las dimensiones que contengan una jerarquía flat (i.e. en el mismo row tienen level1, level2, level3), Como se ven afectadas (en SSAS) si se cambian a tipo SDS2 donde por ejemplo, puedes tener que en un momento dado, el level2 tenia X nombre y luego cambia a Y?

Alan Koo dijo...

Hola José,

Gracias por tu comentario. En realidad funcionaría de manera similar. La idea es que cada fila recibe algún cambio en cualquiera de sus miembros, entonces se cree una nueva versión del mismo. En este caso cuando mapees tus "facts" al valor de dicha dimensión, entonces debes buscar la versión correcta al cual pertenece el hecho. Cuando explores los resultados en el cubo, dependiendo de la fecha en donde estés viendo el hecho, verás el miembro de tu dimensión (y sus hechos asociados). Si el filtro de fechas para el que estas explorando los datos comprende las dos versiones de la fila que sufrio un SCD2, entonces verás las 2 filas, cada una asociada con sus hechos en el momento que ocurrieron (se supone que no aparezca doble asociación del mismo hecho a 2 versiones distintas del miembro de tu dimensión). Espero haber aclaro un poco tu duda.

Alan

cesarhuinchu dijo...

Hola Alan.
Excelente los videos y me ayudaron bastante.
Ahora quisiera saber si el paquete se tiene que hacer click manualmente en "iniciar depuración" o se puede automatizar para que cada vez que haga cambios en la base de datos ORIGEN, se actualice en el DW.

Muchas gracias.

Alan Koo dijo...

César,
Que bueno que te haya servido. En el caso de la ejecución del paquete de manera automática (supongo que eso es lo que quieres). Lo que es usual es crear un Job en el SQL Server Agent para que ejecute tu paquete en unos días y horario específico. Aquí hay un videito que te puede servir: http://msdn.microsoft.com/es-es/library/dd440761(SQL.100).aspx

amdp dijo...

Hola Alan,

muy buenas las explicaciones y los videos. Realmente me han ayudado mucho!

Tengo un problema y es que en la transformación SCD, cuando lo estoy configurando, en la ventana "Historical Attribute Options", en la segunda opción cuando voy a seleccionar mis dos columnas de FechaInicio y FechaFin me sale vacio... y no puedo seleccionar nada...los dos campos son de tipo datetime... me podrías decir qué puede ser? muchas gracias, un saludo. Ana