Carga de dimensões que mudam lentamente

Concluído

Na maioria dos data warehouses relacionais, você precisa lidar com atualizações de dados de dimensão e dar suporte ao que comumente são chamados de SCDs (dimensões de mudança lenta).

Tipos de dimensão em mudança lenta

Existem vários tipos de dimensão em mudança lenta, dos quais três são comumente implementados:

Tipo 0

Os dados de dimensão do tipo 0 não podem ser alterados. Qualquer tentativa de alteração falha.

DateKey DataAltKey Day Month Year
20230101 01-01-2023 Domingo Janeiro 2023

Tipo 1

Nas dimensões do tipo 1 , o registro de dimensão é atualizado no local. As alterações feitas em uma linha de dimensão existente aplicam-se a todos os fatos carregados anteriormente relacionados à dimensão.

StoreKey StoreAltKey StoreName
123 EH199J Loja da High Street Loja Central da Cidade

Tipo 2

Em uma dimensão de tipo 2, uma alteração em uma dimensão resulta em uma nova linha de dimensão. As linhas existentes para versões anteriores da dimensão são mantidas para análise de fatos históricos e a nova linha é aplicada a entradas futuras da tabela de fatos.

CustomerKey ClienteAltKey Nome Morada Localidade DataA partir de DataPara IsCurrent
1211 jo@contoso.com Jo Soares Rua Principal 999 Porto 20190101 20230105 False
2996 jo@contoso.com Jo Soares 1234 9ª Ave Boston 20230106 True

Nota

As dimensões do tipo 2 geralmente incluem colunas para controlar os períodos de tempo efetivos para cada versão de uma entidade e/ou um sinalizador para indicar qual linha representa a versão atual da entidade. Se você estiver usando uma chave substituta incremental e só precisar rastrear a versão adicionada mais recentemente de uma entidade, talvez não precise dessas colunas; Mas antes de tomar essa decisão, considere como você procurará a versão apropriada de uma entidade quando um novo fato for inserido com base no momento em que o evento a que o fato se refere ocorreu.

Combinando instruções INSERT e UPDATE

A lógica para implementar atualizações de Tipo 1 e Tipo 2 pode ser complexa, e há várias técnicas que você pode usar. Por exemplo, você pode usar uma combinação de UPDATE e INSERT instruções.

-- 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;

No exemplo anterior, supõe-se que uma chave substituta incremental com base em uma coluna identifica cada linha e que a chave substituta de valor mais alto para uma IDENTITY determinada chave alternativa indica a instância mais recente ou "atual" da entidade de dimensão associada a essa chave alternativa. Na prática, muitos designers de data warehouse incluem uma coluna booleana para indicar a instância ativa atual de uma dimensão variável ou usam campos DateTime para indicar os períodos de tempo ativos para cada versão da instância de dimensão. Com essas abordagens, a lógica para uma alteração de tipo 2 deve incluir uma da nova linha de dimensão e uma INSERT UPDATE para marcar a linha atual como inativa.

Usando uma instrução MERGE

Como alternativa ao uso de várias INSERT instruções e , você pode usar uma única MERGE instrução para executar uma operação "upsert" para inserir novos registros e UPDATE atualizar os 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 obter mais informações sobre a instrução MERGE, consulte a documentação MERGE do Azure Synapse Analytics.