Laden von langsam veränderlichen Dimensionen
In den meisten relationalen Data Warehouses müssen Sie jedoch mit Updates von Dimensionsdaten umgehen und sich langsam ändernde Dimensionen unterstützen, die sogenannten SCDs (Slowly Changing Dimensions).
Arten von langsam veränderlichen Dimensionen
Es gibt mehrere Arten von SCDs, von denen drei am häufigsten implementiert werden:
Typ 0
Typ 0: Dimensionsdaten können nicht geändert werden. Alle Änderungsversuche schlagen fehl.
DateKey | DateAltKey | Tag | Monat | Jahr |
---|---|---|---|---|
20230101 | 01.01.2023 | Sonntag | January | 2023 |
Typ 1
Bei Dimensionen des Typs 1 wird der Dimensionsdatensatz lokal aktualisiert. Änderungen, die an einer vorhandenen Dimensionszeile vorgenommen werden, gelten für alle zuvor geladenen Fakten im Zusammenhang mit der Dimension.
StoreKey | StoreAltKey | StoreName |
---|---|---|
123 | EH199J |
Typ 2
In einer Dimension vom Typ 2 entsteht durch eine Änderung an einer Dimension eine neue Dimensionszeile. Vorhandene Zeilen für Vorgängerversionen der Dimension werden für die historische Faktenanalyse beibehalten, und die neue Zeile wird auf zukünftige Einträge in der Faktentabelle angewendet.
CustomerKey | CustomerAltKey | Name | Adresse | City | DateFrom | DateTo | IsCurrent |
---|---|---|---|---|---|---|---|
1211 | jo@contoso.com | Jo Smith | 999 Main St | Seattle | 20190101 | 20230105 | False |
2996 | jo@contoso.com | Jo Smith | 1234 9th Ave | Boston | 20230106 | True |
Hinweis
Dimensionen vom Typ 2 enthalten häufig Spalten, um die effektiven Zeiträume für jede Version einer Entität nachzuverfolgen, und bzw. oder ein Flag, um anzugeben, welche Zeile die aktuelle Version der Entität darstellt. Wenn Sie einen inkrementierenden Ersatzschlüssel verwenden und nur die zuletzt hinzugefügte Version einer Entität nachverfolgen müssen, benötigen Sie diese Spalten möglicherweise nicht. Bevor Sie diese Entscheidung treffen, sollten Sie jedoch überlegen, wie Sie die entsprechende Version einer Entität nachschlagen, wenn ein neuer Fakt eingegeben wird, der auf dem Zeitpunkt basiert, zu dem das Ereignis eingetreten ist, auf das sich der Fakt bezieht.
Kombinieren von INSERT- und UPDATE-Anweisungen
Die Logik zur Implementierung von Typ-1- und Typ-2-Aktualisierungen kann komplex sein, und es gibt verschiedene Techniken, die Sie anwenden können. Sie könnten zum Beispiel eine Kombination aus UPDATE
- und INSERT
-Anweisungen verwenden.
-- 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;
Im vorangegangenen Beispiel wird davon ausgegangen, dass ein inkrementeller, auf einer IDENTITY
-Spalte basierender Ersatzschlüssel jede Zeile identifiziert, und dass der höchste Wert des Ersatzschlüssels für einen bestimmten alternativen Schlüssel die jüngste oder „aktuelle“ Instanz der Dimensionsentität angibt, die diesem alternativen Schlüssel zugeordnet ist. In der Praxis fügen viele Data Warehouse-Designer eine boolesche Spalte ein, um die aktuell aktive Instanz einer sich ändernden Dimension anzugeben, oder verwenden DateTime-Felder, um die aktiven Zeiträume für jede Version der Dimensionsinstanz anzugeben. Bei diesen Ansätzen muss die Logik für eine Änderung vom Typ 2 eine INSERT
-Anweisung der neuen Dimensionszeile und eine UPDATE
-Anweisung enthalten, um die aktuelle Zeile als inaktiv zu markieren.
Verwenden einer MERGE-Anweisung
Alternativ zur Verwendung mehrerer INSERT
- und UPDATE
-Anweisungen können Sie eine einzige MERGE
-Anweisung nutzen, um einen Upsert-Vorgang auszuführen, mit dem neue Datensätze eingefügt und vorhandene Datensätze aktualisiert werden.
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);
Hinweis
Weitere Informationen zur MERGE-Anweisung finden Sie in der MERGE-Dokumentation für Azure Synapse Analytics.