加载渐变维度
在许多关系数据仓库中,需要处理对维度数据的更新,并支持通常所说的“渐变维度 (SCD)”。
渐变维度的类型
有多种缓慢变化维度,其中三种通常被采用:
类型 0
无法更改类型 0 维度数据。 任何尝试的更改都失败。
| DateKey | DateAltKey | 星期 | 月份 | 年份 |
|---|---|---|---|---|
| 20230101 | 01-01-2023 | 星期日 | 1 月 | 2023 |
类型 1
在“类型 1”维度中,维度记录就地更新。 对现有维度行所做的更改适用于以前加载的所有与维度相关的事实。
| StoreKey | StoreAltKey | 商店名称 |
|---|---|---|
| 123 | EH199J |
|
类型 2
在 类型 2 维度中,对维度的更改会导致新的维度行。 保留以前版本的维度的现有行以供历史事实分析使用,并将新行应用于将来的事实数据表条目。
| 客户密钥 | CustomerAltKey | 名称 | 地址 | 城市 | DateFrom | DateTo | IsCurrent |
|---|---|---|---|---|---|---|---|
| 1211 | jo@contoso.com | Jo Smith | 999 主街 | 西雅图 | 20190101 | 20230105 | 假 |
| 2996 | jo@contoso.com | Jo Smith | 1234 第 9 大道 | Boston | 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 列的递增代理键标识每一行,并且给定备用键的最高值代理键表示与该备用键关联的维度实体的最新实例或“当前”实例。 实际上,许多数据仓库设计器包括一个布尔列,用于指示更改维度的当前活动实例,或使用 DateTime 字段来指示维度实例的每个版本的活动时间段。 使用这些方法,类型 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 文档。