Carga de dimensiones de variación lenta

Completado

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 High Street Store Town Central Store

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.