最近尝试用SSIS自带的 Slow Changing Transformation组件处理缓慢变化维,看到有一篇文章写的很详细,就按照步骤进行操作同时进行翻译。原网址来自:Managing Slowly Changing Dimension with Slow Changing Transformation in SSIS。
介绍
作为数据库专家或者ETL的开发者你可能偶尔会碰到需要维护和管理缓慢变化唯的场景。在SQL Server中有多种方法来实现,最简单的是使用SSIS 数据流组件中的Slowly Changing DimensionTransformation。
在这片文章中,我会通过一个例子提供如何使用SSIS的Slowly Changing DimensionTransformation管理缓慢变化唯的步骤和指导。
理解缓慢变化维的场景
维度是数据管理和数据仓库中的术语。它指逻辑分组数据比如地理位置,客户或者产品信息。通过缓慢变化维(SCDs),数据缓慢变化而不是基于时间,定期的变化。~Wikipedia
有不同类型的缓慢变化唯独:
SCD Type 0 (Fixed) – 这种类型是最不常用的,在第一次插入后就固定了不接受变化。这意味着一旦写入,这些数据就不会被覆盖。
SCD Type 1 (Changing) – 这种类型,如果数据被更改,她会被新的值覆盖。
相关文章:
SQL Server 2012 Integration Services - Package DeploymentSQL Server 2012 Integration Services - Package and Project ParametersSQL Server 2012 Integration Services - Package VariablesSQL Server 2012 Integration Services - Package and Project ConfigurationsSQL Server 2012 Integration Services - Unattended Execution of SSIS PackagesSQL Server 2012 Integration Services - GUI-Friendly Ways of Managing Execution of SSIS Packages
例如考虑这个例子:
| SupplierCode |
SupplierName |
Address |
| S0000001 |
ABC Company |
USA |
| S0000002 |
XYZ Corporation |
USA |
如果供应商的名字随着时间的推移被更改,正如你在下面看到的供应商的名字已经被新的记录更新了。这种看起来非常简单去实现,但是无法追踪历史记录。
| SupplierCode |
SupplierName |
Address |
| S0000001 |
ABC Company Ltd. |
USA |
| S0000002 |
XYZ Corporation |
USA |
SCD Type 2 (Historical) –在这个类型中,如果数据被更改,它将会保存一个新的记录,旧的记录被标志位过时的。
| SupplierCode |
SupplierName |
Address |
EffectiveDate |
Expiration Date |
| S0000001 |
ABC Company |
USA |
3/2/2013 |
3/2/2013 |
| S0000002 |
XYZ Corporation |
USA |
3/2/2013 |
| S0000001 |
ABC Company Ltd. |
USA |
3/3/2013 |
为了维护SCD type 2,不同的人采用不同的方法。比如,一种方法是通过增加有效日期和过期日期表示记录是活跃的。如果截止日期为NULL表示当前的记录是活跃的。另外一种方法是添加一个标志列表示当前活动记录。通常人们会使用第一种方法或者两者的结合。
SCD Type 4 (Limited history) –这不是一个常用的类型因为只能维护有限的更改。在这种SCD类型中,通过表中添加额外的列保存旧值。
| SupplierCode |
SupplierName |
Address |
OldSupplierName |
| S0000001 |
ABC Company |
USA |
ABC Company Ltd. |
| S0000002 |
XYZ Corporation |
USA |
在SQLServer中有多种方法实现缓慢变化维度,最简单的是使用SSIS 数据流组件中的Slowly Changing Dimension Transformation,尽管会有一些限制,文章结尾的时候会提到这些限制。
在我开始Slowly Changing Dimension Transformation组件解释之前,让我先解释一下代理键并且为什么它对数据仓库很重要。我们经常会在维度中增加一个没有意义的键叫做代理键。代理键通常是整数,充当唯独表的唯一键或者主键,并且作为事实表外键约束。代理键对于管理缓慢变化唯变得非常重要。
使用Slowly Changing Dimension Transformation
我们首先创建一个供应商表并添加一些数据。你应该可以看到,我增加了SupplierCode字段作为主键,当作业务键。
| USE [AdventureWorks2012] GO CREATE TABLE[dbo].[Supplier]( [SupplierCode] CHAR(8) PRIMARY KEY, [SupplierName] [varchar](50)NULL, [Address] [varchar](50)NULL, ) ON[PRIMARY] GO INSERT INTO[dbo].[Supplier]([SupplierCode],[SupplierName], [Address]) VALUES ('S0000001','ABC Company', 'USA'), ('S0000002','XYZ Corporation','USA') GO SELECT *FROM [dbo].[Supplier] |
现在我们创建一个维度表存储供应商信息,你应该注意到我增加了SupplierId字段作为代理键,生效时间和截止时间用来追踪历史变化。另外我增加了CurrentFlag列用来标注当前记录是否活跃。
| USE [AdventureWorks2012] GO CREATE TABLE[dbo].[DimSupplier]( [SupplierId] [int] IDENTITY(1,1)NOT NULL, [SupplierCode] CHAR(8), [SupplierName] [varchar](50)NULL, [Address] [varchar](50)NULL, [EffectiveDate] [date] NULL, [ExpirationDate] [date] NULL, [CurrentFlag] [char](1) NULL, CONSTRAINT [PK_DimSupplier] PRIMARY KEY CLUSTERED ([SupplierId]ASC) ) ON[PRIMARY] GO |
到目前为止一切顺利,现在我们创建一个SSIS包,增加一个数据流任务,拖入数据源组件从原始表获取数据。现在新增一个SlowlyChanging Dimension