Carga de dimensiones de variación lenta
En la mayoría de almacenamientos de datos relacionales, debe controlar las actualizaciones de los datos de dimensión y asumir lo que se conoce normalmente como dimensiones de variación lenta (SCD).
Tipos de dimensiones de variación lenta
Hay varios tipos de dimensiones que cambian lentamente, de las cuales tres se implementan normalmente:
Tipo 0
Los datos de dimensión de tipo 0 no se pueden cambiar. Se produce un error en los intentos de cambio.
DateKey | DateAltKey | Día | Mes | Año |
---|---|---|---|---|
20230101 | 01-01-2023 | Domingo | January | 2023 |
Tipo 1
En las dimensiones de tipo 1, el registro de dimensión se actualiza en contexto. Los cambios realizados en una fila de dimensión existente se aplican a todos los hechos cargados previamente relacionados con la dimensión.
ClaveTienda | StoreAltKey | StoreName |
---|---|---|
123 | EH199J |
Tipo 2
En una dimensión de tipo 2, un cambio en una dimensión da como resultado una nueva fila de dimensión. Las filas existentes para las versiones anteriores de la dimensión se conservan para el análisis de hechos históricos y la nueva fila se aplica a las entradas futuras de la tabla de hechos.
CustomerKey | CustomerAltKey | Nombre | Dirección | City | DateFrom | DateTo | IsCurrent |
---|---|---|---|---|---|---|---|
1211 | jo@contoso.com | Jo Smith | 999 Main St | Seattle | 20190101 | 20230105 | Falso |
2996 | jo@contoso.com | Jo Smith | 1234 9th Ave | Boston | 20230106 | True |
Nota
Las dimensiones de tipo 2 suelen incluir columnas para realizar un seguimiento de los períodos de tiempo efectivos de cada versión de una entidad y/o una marca para indicar qué fila representa la versión actual de la entidad. Si usa una clave suplente incremental y solo necesita realizar un seguimiento de la versión agregada más recientemente de una entidad, es posible que no necesite estas columnas; pero antes de tomar esa decisión, tenga en cuenta cómo buscará la versión adecuada de una entidad cuando se escriba un nuevo hecho en función del momento en el que se ha producido el evento relacionado con el hecho.
Combinación de instrucciones INSERT y UPDATE
La lógica para implementar las actualizaciones de tipo 1 y tipo 2 puede ser compleja y hay varias técnicas que puede usar. Por ejemplo, podría usar una combinación de instrucciones UPDATE
y INSERT
.
-- New Customers
INSERT INTO dbo.DimCustomer
SELECT stg.*
FROM dbo.StageCustomers AS stg
WHERE NOT EXISTS
(SELECT * FROM dbo.DimCustomer AS dim
WHERE dim.CustomerAltKey = stg.CustNo)
-- Type 1 updates (name)
UPDATE dbo.DimCustomer
SET CustomerName = stg.CustomerName
FROM dbo.StageCustomers AS stg
WHERE dbo.DimCustomer.CustomerAltKey = stg.CustomerNo;
-- Type 2 updates (StreetAddress)
INSERT INTO dbo.DimCustomer
SELECT stg.*
FROM dbo.StageCustomers AS stg
JOIN dbo.DimCustomer AS dim
ON stg.CustNo = dim.CustomerAltKey
AND stg.StreetAddress <> dim.StreetAddress;
En el ejemplo anterior, se supone que una clave suplente incremental basada en una columna IDENTITY
identifica cada fila y que la clave suplente de valor más alto para una clave alternativa determinada indica la instancia más reciente o "actual" de la entidad de dimensión asociada a esa clave alternativa. En la práctica, muchos diseñadores de almacenamiento de datos incluyen una columna booleana para indicar la instancia activa actual de una dimensión cambiante o usan campos DateTime para indicar los períodos de tiempo activos de cada versión de la instancia de dimensión. Con estos enfoques, la lógica de un cambio de tipo 2 debe incluir una instrucción INSERT
de la nueva fila de dimensión y una instrucción UPDATE
para marcar la fila actual como inactiva.
Uso de una instrucción MERGE
Como alternativa al uso de varias instrucciones INSERT
y UPDATE
, puede usar una única instrucción MERGE
para realizar una operación "upsert" para insertar nuevos registros y actualizar los existentes.
MERGE dbo.DimProduct AS tgt
USING (SELECT * FROM dbo.StageProducts) AS src
ON src.ProductID = tgt.ProductBusinessKey
WHEN MATCHED THEN
-- Type 1 updates
UPDATE SET
tgt.ProductName = src.ProductName,
tgt.ProductCategory = src.ProductCategory,
tgt.Color = src.Color,
tgt.Size = src.Size,
tgt.ListPrice = src.ListPrice,
tgt.Discontinued = src.Discontinued
WHEN NOT MATCHED THEN
-- New products
INSERT VALUES
(src.ProductID,
src.ProductName,
src.ProductCategory,
src.Color,
src.Size,
src.ListPrice,
src.Discontinued);
Nota
Para obtener más información sobre la instrucción MERGE, consulte la Documentación de MERGE para Azure Synapse Analytics.