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