Načítání pomalu se měnících dimenzí
Ve většině relačních datových skladů je potřeba zpracovat aktualizace dat dimenzí a podporovat to, co se běžně označuje jako pomalu se měnící dimenze (SCD).
Typy pomalu se měnící dimenze
Existuje několik druhů pomalu se měnících dimenzí, z nichž tři se běžně implementují:
Typ 0
Data dimenzí typu 0 nelze změnit. Všechny pokusy o změny selžou.
DateKey | DateAltKey | Den | Měsíc | Year |
---|---|---|---|---|
20230101 | 01-01-2023 | Neděle | Leden | 2023 |
Typ 1
V rozměrech typu 1 se záznam dimenze aktualizuje na místě. Změny provedené u existujícího řádku dimenze platí pro všechna dříve načtená fakta týkající se dimenze.
StoreKey | StoreAltKey | StoreName |
---|---|---|
123 | EH199J |
Typ 2
Při změně na dimenzi typu 2 vznikne nový řádek dimenze. Existující řádky pro předchozí verze dimenze se uchovávají pro historickou analýzu faktů a nový řádek se použije pro budoucí položky tabulky faktů.
CustomerKey | CustomerAltKey | Název | Address | Město | DateFrom | DateTo | IsCurrent |
---|---|---|---|---|---|---|---|
1211 | jo@contoso.com | Jo Smith | 999 Main St | Seattle | 20190101 | 20230105 | False |
2996 | jo@contoso.com | Jo Smith | 1234 9. Ave | Boston | 20230106 | True |
Poznámka:
Dimenze typu 2 často obsahují sloupce pro sledování efektivních časových období pro každou verzi entity a/nebo příznak označující, který řádek představuje aktuální verzi entity. Pokud používáte přírůstkový náhradní klíč a potřebujete sledovat pouze nejnovější přidanou verzi entity, možná tyto sloupce nepotřebujete; než se však rozhodnete, zvažte, jak vyhledáte odpovídající verzi entity, když je zadána nová skutečnost na základě času, kdy k události, ke které se fakt vztahuje.
Kombinování příkazů INSERT a UPDATE
Logika implementace aktualizací typu 1 a Type 2 může být složitá a můžete použít různé techniky. Můžete například použít kombinaci UPDATE
příkazů a INSERT
příkazů.
-- 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;
V předchozím příkladu se předpokládá, že přírůstkový náhradní klíč založený na IDENTITY
sloupci identifikuje každý řádek a že nejvyšší náhradní klíč hodnoty pro daný alternativní klíč označuje nejnovější nebo "aktuální" instanci entity dimenze přidružené k danému alternativnímu klíči. V praxi mnoho návrhářů datového skladu obsahuje logický sloupec označující aktuální aktivní instanci měnící se dimenze nebo použití polí DateTime k označení aktivních časových období pro každou verzi instance dimenze. V těchto přístupech musí logika změny typu 2 obsahovat INSERT
nový řádek dimenze a UPDATE
označit aktuální řádek jako neaktivní.
Použití příkazu MERGE
Jako alternativu k použití více INSERT
příkazů a UPDATE
příkazů můžete použít jeden MERGE
příkaz k provedení operace upsert pro vložení nových záznamů a aktualizaci existujících záznamů.
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);
Poznámka:
Další informace o příkazu MERGE najdete v dokumentaci KE SLOUČENÍ pro Azure Synapse Analytics.