Langzaam veranderende dimensies laden
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 |
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.