Slowly Changing Dimension y SQL Azure DWH

Azure DWH ha sido uno de esos productos que siempre me ha parecido un volador total, la implementación es muy rapida y el rendimiento funciona a las mil maravillas, sin embargo, sufrimos mucho cuando de funcionalidades de SQL se trata, la verdad suponía que al tratarse de un producto para hacer bodegas de datos, los componentes de SQL Server Integration Services como Slowly Changing Dimension funcionaran de igual manera, lastimosamente no fue así, este post es para brindarles una salida funcional y de muy buen rendimiento a este inconveniente.

Para este ejercicio tenemos lo siguiente.

Mi tabla fuente

CREATE TABLE SCD_DEMO_FUENTE (ID INT IDENTITY(1,1), BK_CLIENTE INT, NOMBRECLIENTE VARCHAR(100), TELEFONO VARCHAR(100),FECHAVIGENCIA DATETIME, FECHAFINVIGENCIA DATETIME);

Mi tabla destino

CREATE TABLE SCD_DEMO (ID INT IDENTITY(1,1), BK_CLIENTE INT, NOMBRECLIENTE VARCHAR(100), TELEFONO VARCHAR(100),FECHAVIGENCIA DATETIME, FECHAFINVIGENCIA DATETIME);

Una vista para poder referenciar la tabla destino (Otra restricción de Azure DWH)

CREATE VIEW SCD_DEMO_V AS SELECT * FROM SCD_DEMO WHERE FECHAFINVIGENCIA IS NULL;

Voy a describir la ETL para hacerlo de la forma mas rapida posible.

  • Me conecto por ADO.NET a mi DWH
  • Mediante un Lookup, verifico utilizando el BK de mi tabla para verificar datos existentes
  • Configuro el Lookup para que aquellos que no hagan Match, sean redireccionados a otro destino
  • Agrego una columna derivada de fecha (Fecha de entrada en vigencia del registro)
  • Inserto la fila que es completamente nueva a mi BD destino.
  • Por el otro lado, agrego otra columna derivada que verifique si mis datos cambiaron o si siguen siendo iguales Fuente.TELEFONO == [VERIFICAR FILAS EXISTENTES Y NO EXISTENTES].TELEFONO ? "IGUAL" : "DIFERENTE"

  • Agrego un Conditional Split para separar aquellos datos que cambiaron de los que siguen igual.

  • Solo saco aquellos que cambiaron y a estos les agrego una columna derivada que agregue la fecha del nuevo registro
  • Inserto el nuevo registro

Fuera del Data Flow, agrego una tarea de tipo Execute SQL Task en donde hago un update en batch de aquellos registros que ahora son inválidos.

Utilizando el siguiente codigo

UPDATE SCD_DEMO SET FECHAFINVIGENCIA = GETDATE() FROM SCD_DEMO_V WHERE SCD_DEMO.BK_CLIENTE = SCD_DEMO_V.BK_CLIENTE AND SCD_DEMO.FECHAFINVIGENCIA IS NULL AND DATEDIFF(MINUTE, SCD_DEMO.FECHAVIGENCIA, SCD_DEMO_V.FECHAVIGENCIA) > 0

Si quiere descargar la ETL de ejemplo, haga clic aquí