Este documento describe varios métodos para detectar cambios en un almacén de datos (data warehouse), incluyendo eliminación y recarga, transformación de tipo de cambio de dimensión estándar (SCD), búsqueda, transformación Kimball SCD, método MergeJoin, transformación T-SQL MERGE y detección de cambios de datos (CDC). Explica las ventajas e inconvenientes de cada método y proporciona ejemplos de su implementación.
4. Problema
4 |
Origen Destino
Dato 1 A 1 A
Dato 2 B 2 K
Dato 3 C 5 E
Dato 4 D
Acción Dato Original Nuevo Dato
Actualización 2 K 2 B
Inserción 3 C
Inserción 4 D
Borrado 5 E
Acción Datos Fecha Efectiva Fecha Expiración
Actualización 2 B
Obsoleto 2 K
Inserción
Inserción
Obsoleto 5 E
5. Detección de Cambios
Es uno de los problemas a resolver al crear un WareHouse
Existen varias formas de resolver éste problema
Eliminación y recarga
Transformación SCD
Lookup
Transformada Kimball SCD
Método MergeJoin (Ideado por Freddy Angarita)
Método T-Sql Merge
CDC
6. Tipos de Dimensión y Administración
Tipo 0
No mantiene historia
Geografía
Debe considerarse integridad referencial
Tipo I
Sobrescribe datos antiguos con los nuevos
Usado para aplicar cambios sobre tablas de hechos (Idealmente)
Es importante considerar la integridad referencial
Tipo II
Una nueva fila para cada cambio que se genere para cada registros
Se crea una fecha efectiva y una fecha de expiración
Tipo III
Se crea historia sólo para algunas columnas
Normalmente sólo contienen el último valor de la columna
7. Eliminación y Carga
Es un método simple de implementar
Se implementa rápidamente
Cantidad de Datos
Complejidad de la tabla
Ventana de tiempo
Requerimientos del sistema
Si la tabla se usa como una Fuente ROLAP ó Direct Query
(Depende del tipo cubo)
No es una opción
Puede tomar mucho tiempo
9. Transformación SCD
Ventajas
Es un método simple de implementar
Desventajas
Realiza las actualizaciones en la tabla destino registro a registro
No recuerda las opciones de diseño realizadas
No se respetan relaciones hechas anteriormente
Útil para detección de cambios para dimensiones simples
11. Transformación LookUp
Ventajas
Ofrece buen rendimiento
Desventajas
No es tan simple de implementar
La comparación se realiza registro a registro
13. Transformación Kimball
Ventajas
Ofrece buen rendimiento
La comparación se realiza por conjuntos
Desventajas
No es tan simple de implementar
Es necesario instalar el complemento
No usa transformaciones estándar
http://dimensionmergescd.codeplex.com/
15. Transformación MergeJOIN
Ventajas
Ofrece buen rendimiento
La comparación se realiza por conjuntos
Usa transformaciones estándar
No es necesario instalar ningún complemento
Desventajas
No es tan simple de implementar
16. Transformación MergeJOIN
Llave Dato
A 1
B 56
C 2
Llave Dato
A 1
B 23
D 34
Llave Actual Llave Nueva Dato Actual Dato Nuevo
A A 1 1
B B 56 23
C NULL 2 NULL
NULL D NULL 34
18. Transformación t-Sql MERGE
Ventajas
Ofrece buen rendimiento
Es simple de implementar
La detección de cambios vive en la base de datos
Desventajas
No se recomienda su uso para escenarios OLTP (Locks)
20. Ventana de Tiempo
Ventajas
Reduce la cantidad de registros a procesar
Desventajas
Es necesario tener campos de fecha en las tablas a analizar
22. CDC
Ventajas
Reduce la cantidad de registros a procesar
Fácil implementación
Desventajas
No funciona con todos los orígenes de datos
23. CDC - Script
USE InternetSales
GO
--Habilitar CDC para base de datos
EXEC sys.sp_cdc_enable_db
GO
--Habilitar CDC para tabla
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',@source_name = N'Customers',@role_name= NULL,@supports_net_changes = 1
GO
--Mapear inicio y finalización a números de secuencia
DECLARE @from_lsn binary(10), @to_lsn binary(10);
SET @from_lsn = sys.fn_cdc_map_time_to_lsn('smallest greater than', @StartDate) -- >
SET @to_lsn = sys.fn_cdc_map_time_to_lsn('largest less than or equal', @EndDate) -- <=
--Manejar correctamente Nulos
IF (@from_lsn IS NULL) OR (@to_lsn IS NULL)
-- No hubo transacciones en éste marco de tiempo
--Extraer Cambios
SELECT * FROM cdc.fn_cdc_get_net_changes_dbo_Customers(@from_lsn, @to_lsn, 'all')