Carregar dimensões variáveis lentas
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 |
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.