Läs in långsamt föränderliga dimensioner

Slutförd

I de flesta relationsdatalager måste du hantera uppdateringar av dimensionsdata och stödja vad som vanligtvis kallas långsamt föränderliga dimensioner (SCD).

Typer av långsamt föränderlig dimension

Det finns flera typer av långsamt föränderliga dimensioner, varav tre implementeras ofta:

Typ 0

Det går inte att ändra typ 0-dimensionsdata . Alla försök till ändringar misslyckas.

DateKey DateAltKey Dag Månad Year
20230101 01-01-2023 söndag Januari 2023

Typ 1

I typ 1-dimensioner uppdateras dimensionsposten på plats. Ändringar som gjorts i en befintlig dimensionsrad gäller för alla tidigare inlästa fakta relaterade till dimensionen.

StoreKey StoreAltKey StoreName
123 EH199J High Street Store Town Central Store

Typ 2

I en typ 2-dimension resulterar en ändring av en dimension i en ny dimensionsrad. Befintliga rader för tidigare versioner av dimensionen behålls för historisk faktaanalys och den nya raden tillämpas på framtida faktatabellposter.

CustomerKey CustomerAltKey Name Address Ort DateFrom DateTo IsCurrent
1211 jo@contoso.com Jo Smith 999 Main St Seattle 20190101 20230105 Falsk
2996 jo@contoso.com Jo Smith 1234 9th Ave Boston 20230106 Sant

Kommentar

Typ 2-dimensioner innehåller ofta kolumner för att spåra de effektiva tidsperioderna för varje version av en entitet och/eller en flagga för att ange vilken rad som representerar den aktuella versionen av entiteten. Om du använder en inkrementell surrogatnyckel och du bara behöver spåra den senast tillagda versionen av en entitet kanske du inte behöver dessa kolumner. men innan du fattar det beslutet bör du fundera på hur du ska leta upp rätt version av en entitet när ett nytt faktum anges baserat på den tidpunkt då händelsen som händelsen avser inträffade.

Kombinera INSERT- och UPDATE-instruktioner

Logik för att implementera typ 1- och typ 2-uppdateringar kan vara komplex och det finns olika tekniker som du kan använda. Du kan till exempel använda en kombination av UPDATE och INSERT -instruktioner.

-- 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;

I föregående exempel förutsätts det att en inkrementell surrogatnyckel baserat på en IDENTITY kolumn identifierar varje rad och att den högsta surrogatnyckeln för en viss alternativ nyckel anger den senaste eller "aktuella" instansen av dimensionsentiteten som är associerad med den alternativa nyckeln. I praktiken innehåller många informationslagerdesigners en boolesk kolumn som anger den aktuella aktiva instansen av en föränderlig dimension eller använder DateTime-fält för att ange aktiva tidsperioder för varje version av dimensionsinstansen. Med dessa metoder måste logiken för en typ 2-ändring innehålla en INSERT av den nya dimensionsraden och en UPDATE för att markera den aktuella raden som inaktiv.

Använda en MERGE-instruktion

Som ett alternativ till att använda flera INSERT instruktioner och UPDATE instruktioner kan du använda en enda MERGE instruktion för att utföra en "upsert"-åtgärd för att infoga nya poster och uppdatera befintliga.

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);

Kommentar

Mer information om MERGE-instruktionen finns i MERGE-dokumentationen för Azure Synapse Analytics.