Läs in långsamt föränderliga dimensioner
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 |
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.