Laden von langsam veränderlichen Dimensionen

Abgeschlossen

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 High Street Store Town Central Store

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.