Carregar dimensões variáveis lentas

Concluído

Na maioria dos data warehouses, você precisa lidar com atualizações dos dados de dimensões e dar suporte ao que costumamos chamar de SCDs (dimensões variáveis lentas).

Tipos de dimensões variáveis lentas

Há vários tipos de dimensões com variação lenta, dos quais três costumam ser implementados:

Tipo 0

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

DateKey DateAltKey Dia Mês Ano
20230101 01-01-2023 Sunday Janeiro 2023

Tipo 1

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

StoreKey StoreAltKey StoreName
123 EH199J High Street Store Town Central Store

Tipo 2

Em uma dimensão do 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 retidas para análise de fatos históricos e a nova linha é aplicada a entradas futuras da tabela de fatos.

CustomerKey CustomerAltKey Nome Endereço City DateFrom DateTo IsCurrent
1211 jo@contoso.com Julieta Oliveira 999 Main St Seattle 20190101 20230105 Falso
2996 jo@contoso.com Julieta Oliveira 1234 9th Ave Boston 20230106 True

Observação

As dimensões do tipo 2 costumam incluir colunas para acompanhamento dos períodos efetivos de cada versão de uma entidade e/ou um sinalizador para indicar a linha que representa a versão atual da entidade. Se você estiver usando uma chave alternativa incremental e precisar apenas acompanhar a versão adicionada mais recentemente de uma entidade, talvez não precise dessas colunas. No entanto, antes de tomar essa decisão, considere como você pesquisará a versão apropriada de uma entidade quando um novo fato for inserido com base no momento em que ocorreu o evento ao qual o fato se relaciona.

Como combinar 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 instruções UPDATE e 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;

No exemplo anterior, supõe-se que uma chave alternativa incremental com base em uma coluna IDENTITY identifique cada linha e que a chave alternativa de valor mais alto para determinada chave alternativa indique 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 booliana para indicar a instância ativa atual de uma dimensão variável ou usam campos de DateTime para indicar os períodos ativos para cada versão da instância de dimensão. Com essas abordagens, a lógica de uma alteração do tipo 2 deve incluir uma INSERT da nova linha de dimensão e uma UPDATE para marcar a linha atual como inativa.

Como usar uma instrução MERGE

Como alternativa ao uso de várias instruções INSERT e UPDATE, você pode usar uma só instrução MERGE para executar uma operação de "upsert" a fim de inserir novos registros e 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);

Observação

Para obter mais informações sobre a instrução MERGE, confira a documentação de MERGE do Azure Synapse Analytics.