Langzaam veranderende dimensies laden

Voltooid

In de meeste relationele datawarehouses moet u updates voor dimensiegegevens afhandelen en ondersteuning bieden voor wat vaak wordt aangeduid als langzaam veranderende dimensies (SCD's).

Typen langzaam veranderende dimensie

Er zijn meerdere soorten langzaam veranderende dimensies, waarvan drie vaak worden geïmplementeerd:

Type 0

Type 0-dimensiegegevens kunnen niet worden gewijzigd. Pogingen om wijzigingen uit te voeren, mislukken.

DateKey DateAltKey Dag Maand Jaar
20230101 01-01-2023 Zondag januari 2023

Type 1

In dimensies van type 1 wordt de dimensierecord ter plaatse bijgewerkt. Wijzigingen in een bestaande dimensierij zijn van toepassing op alle eerder geladen feiten met betrekking tot de dimensie.

StoreKey StoreAltKey StoreName
123 EH199J High Street Store Town Central Store

Type 2

In een type 2-dimensie resulteert een wijziging in een dimensie in een nieuwe dimensierij. Bestaande rijen voor eerdere versies van de dimensie worden bewaard voor historische feitenanalyse en de nieuwe rij wordt toegepast op toekomstige feitentabelvermeldingen.

CustomerKey CustomerAltKey Naam Adres Plaats DateFrom DateTo IsCurrent
1211 jo@contoso.com Jo Smith 999 Main St Seattle 20190101 20230105 Onwaar
2996 jo@contoso.com Jo Smith 1234 9e Ave Boston 20230106 Waar

Notitie

Type 2-dimensies bevatten vaak kolommen om de effectieve tijdsperioden voor elke versie van een entiteit bij te houden en/of een vlag om aan te geven welke rij de huidige versie van de entiteit vertegenwoordigt. Als u een incrementele surrogaatsleutel gebruikt en u alleen de laatst toegevoegde versie van een entiteit hoeft bij te houden, hebt u deze kolommen mogelijk niet nodig; Maar voordat u deze beslissing neemt, moet u overwegen hoe u de juiste versie van een entiteit opzoekt wanneer een nieuw feit wordt ingevoerd op basis van het tijdstip waarop het feit betrekking heeft opgetreden.

INSERT- en UPDATE-instructies combineren

Logica voor het implementeren van Type 1- en Type 2-updates kan complex zijn en er zijn verschillende technieken die u kunt gebruiken. U kunt bijvoorbeeld een combinatie van UPDATE en INSERT instructies gebruiken.

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

In het vorige voorbeeld wordt ervan uitgegaan dat een incrementele surrogaatsleutel op basis van een IDENTITY kolom elke rij identificeert en dat de hoogste waarde surrogaatsleutel voor een bepaalde alternatieve sleutel het meest recente of 'huidige' exemplaar aangeeft van de dimensie-entiteit die is gekoppeld aan die alternatieve sleutel. In de praktijk bevatten veel datawarehouseontwerpers een Booleaanse kolom om het huidige actieve exemplaar van een veranderende dimensie aan te geven of datetime-velden te gebruiken om de actieve perioden voor elke versie van het dimensie-exemplaar aan te geven. Met deze benaderingen moet de logica voor een type 2-wijziging een INSERT van de nieuwe dimensierij bevatten en een UPDATE om de huidige rij als inactief te markeren.

Een MERGE-instructie gebruiken

Als alternatief voor het gebruik van meerdere INSERT en UPDATE instructies kunt u één MERGE instructie gebruiken om een upsert-bewerking uit te voeren om nieuwe records in te voegen en bestaande records bij te werken.

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

Notitie

Zie de MERGE-documentatie voor Azure Synapse Analytics voor meer informatie over de MERGE-instructie.