Carga de dimensões que mudam lentamente
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 |
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.