Carregar dimensões variáveis lentas

Concluído

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

Tipos de dimensão de alteração lenta

Há vários tipos de dimensão de alteração lenta, dos quais três geralmente são implementados:

Tipo 0

Os dados da dimensão tipo 0 não podem ser alterados. Todas as tentativas de alterações falham.

DateKey DateAltKey Dia Mês Ano
20230101 01-01-2023 Domingo 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 aplicam a todos os fatos carregados anteriormente relacionados à dimensão.

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

Tipo 2

Em uma dimensão 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 Cidade DateFrom DateTo IsCurrent
1211 jo@contoso.com Jo Smith Rua Principal 999 Seattle 20190101 20230105 Falso
2996 jo@contoso.com Jo Smith 1234 9th Ave Boston 20230106 Verdade

Observação

As dimensões tipo 2 geralmente incluem colunas para acompanhar 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 de incremento e precisar apenas acompanhar 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 ao qual o fato está relacionado ocorreu.

Como combinar instruções INSERT e UPDATE

A lógica para implementar as atualizações do Tipo 1 e do 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 substituta de incremento com base em uma IDENTITY coluna identifique cada linha e que a chave substituta de valor mais alto para uma 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 booliana para indicar a instância ativa atual de uma dimensão em alteração ou usar 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 de uma alteração 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 múltiplas instruções INSERT e UPDATE, você pode usar uma única instrução MERGE para realizar uma operação "upsert", inserindo novos registros e atualizando 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, consulte a documentação MERGE do Azure Synapse Analytics.