載入緩時變維度

已完成

在大部分的關聯式資料倉儲中,您需要處理對維度資料的更新,並支援通常稱為「緩時變維度」(SCD) 的維度。

緩時變維度的類型

有許多種緩時變維度,通常會實作其中三種:

類型 0

類型 0 的維度資料無法變更。 任何嘗試的變更都失敗。

DateKey DateAltKey Day Month Year
20230101 01-01-2023 星期日 一月 2023

類型 1

類型 1 的維度中,維度記錄會就地更新。 對現有維度資料列所做的變更會套用到所有先前載入且與維度相關的事實。

StoreKey StoreAltKey StoreName
123 EH199J 大街商店 城鎮中心商店

類型 2

類型 2 維度中,維度上的變更會產生新的維度資料列。 舊版維度的現有資料列會保留,以供歷史事實分析使用,而新資料列會套用到未來事實資料表項目。

CustomerKey CustomerAltKey 名稱 位址 市/鎮 DateFrom DateTo IsCurrent
1211 jo@contoso.com Jo Smith 999 Main St 西雅圖 20190101 20230105 False
2996 jo@contoso.com Jo Smith 1234 9th Ave 波士頓 20230106 True

注意

類型 2 維度通常包含資料行,可用來追蹤每個實體版本的有效時間週期,以及 (或是) 包含旗標,以指出哪個資料列代表實體的目前版本。 如果您使用遞增代理索引鍵,而且只需要追蹤最近新增的實體版本,則您可能不需要這些資料行;但在做出該決策之前,請考慮您如何根據事實相關事件的發生時間,在新事實輸入時查閱適當的實體版本。

結合 INSERT 與 UPDATE 陳述式

實作類型 1 和類型 2 更新的邏輯可能很複雜,而您可以使用各種技術。 例如,您可以使用 UPDATEINSERT 陳述式的組合。

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

在上一個範例中,假設以 IDENTITY 資料行為基礎的遞增代理索引鍵會識別每個資料列,而適用於指定替代索引鍵的最高值代理索引鍵會指出與該替代索引鍵相關聯之維度實體的最新或「目前」執行個體。 實際上,許多資料倉儲設計工具都會包括一個布林值資料行來指出變更維度目前使用中的執行個體,或使用日期時間欄位來指出每個維度執行個體版本的使用中時間週期。 使用這些方法,類型 2 變更的邏輯必須包括新維度資料列的 INSERT「和」UPDATE,才能將目前資料列標示為非使用中。

使用 MERGE 陳述式

除了使用多個 INSERTUPDATE 陳述式,您可以使用單一 MERGE 陳述式來執行 "upsert" 作業,以插入新的記錄並更新現有記錄。

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

注意

如需 MERGE 陳述式的詳細資訊,請參閱 Azure Synapse Analytics 的 MERGE 文件