加载渐变维度
在许多关系数据仓库中,需要处理对维度数据的更新,并支持通常所说的“渐变维度 (SCD)”。
渐变维度的类型
有多种渐变维度,其中有三种常见的实现方式:
类型 0
无法更改“类型 0”维度数据。 任何尝试的更改都失败。
DateKey | DateAltKey | 日期 | Month | 年份 |
---|---|---|---|---|
20230101 | 01-01-2023 | 星期日 | 1 月 | 2023 |
类型 1
在“类型 1”维度中,维度记录就地更新。 对现有维度行所做的更改适用于所有先前加载的与维度相关的事实数据。
StoreKey | StoreAltKey | StoreName |
---|---|---|
123 | EH199J |
类型 2
在“类型 2”维度中,对维度的更改会生成一个新的维度行。 以前版本的维度的现有行被保留用于历史事实数据分析,新行将应用于将来的事实数据表条目。
CustomerKey | CustomerAltKey | 名称 | 地址 | 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 | 波士顿 | 20230106 | True |
注意
类型 2 维度通常包括用于跟踪实体每个版本的有效时间段的列,和/或用于指示哪个行表示实体当前版本的标志。 如果要使用递增的代理键,并且只需跟踪最近添加的实体版本,则可能不需要这些列;但在做出该决定之前,请考虑当根据与事实相关的事件发生的时间输入新事实时,你将如何查找实体的相应版本。
合并 INSERT 和 UPDATE 语句
实现类型 1 和类型 2 更新的逻辑可能很复杂,你可以使用各种技术。 例如,可以结合使用 UPDATE
和 INSERT
语句。
-- 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 语句
作为使用多个 INSERT
和 UPDATE
语句的替代方法,你可使用单个 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 文档。