Načítání pomalu se měnících dimenzí

Dokončeno

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 High Street Store Town Central Store

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.