SSIS|SSIS 渐变维度转换控件(Slowly Changing Dimension Transformation)加载维度表
?开篇介绍
先了解下什么是缓慢渐变维,为什么要渐变维?公司员工信息可能发生变化,比如:电话号码,基本薪资,邮箱等都可能会发生变化。数据仓库中记录员工信息的维度表对应的属性做相应的更改才能保证数据一致。
案例介绍
示例数据库AdventureWorksDW,AdventureWorks。在此示例中,DimSaleTerritory表来源于Sale.SaleTerritory,源的变化都会引起维度表中三列的变化,这些变化 的列将作为维度属性来引用。可能说的有点抽象,具体看实际案例步骤。
a.新建一个包,名为ETL_DimSaleTerritory,新建两个OLEDB项目连接,分别指向新建的连接管理器AdventureWorksDW,AdventureWorks。
b.在控制流中拖入一个数据流任务控件,转到数据流设计器。OLEDB源的配置如图
文章图片
b1.只勾选DimSaleTerritory需要的列即可,点确定,如图所示。
文章图片
c.拖一个查找转换控件,设置缓存模式为‘完全缓存’,连接方式‘OLEDB连接管理器’如图所示
文章图片
c1.连接配置如图所示
文章图片
c2.列配置:以CountryRegionCode列在查找转换中找到Person.CountryRegion中的name,并将name输出别名命名为SalesTerritoryCountry
文章图片
以上步骤目的:使源数据与目标维度表相对齐,下面步骤将是处理维度的核心部分,使用渐变维转换控件。
d.拖入渐变维度控件,接入查找转换控件蓝色数据路径。此时会弹出消息框,选择查找’匹配输出‘。
d1.双击渐变控件维,需要确定维度表与哪个数据源关联。连接管理器选择‘AdventureWorksDW’,选择维度表DimSalesTerritory。
再将SalesTerritoryAlternateKey键类型改为业务键。
目的:
【SSIS|SSIS 渐变维度转换控件(Slowly Changing Dimension Transformation)加载维度表】1.确定源与目标之间匹配的行。
2.将源中的列与维表属性匹配,下一步将会使用该匹配来确定更改跟踪类型。
注意:源与维度之间的列是根据名称相同自动匹配的。如果名称不同,将要手动匹配。如图所示。
文章图片
e.在向导下一步中,需要将每个匹配列被标识为一种更改类型。此案例所有列都更改了属性,来匹配DimSalesTerritory维度。所以更改类型选择‘变化的属性’
三种更改类型的说明,如图所示。
文章图片
f.继续下一步中,会出现‘固定属性选项和变化属性选项‘。
固定属性选项:此时灰色,因为之前更改类型没有固定属性。
变化属性选项:可以更改候选键匹配所有记录,也可以只更新最近变化的属性。此案例选择哪一种不重要,因为每个候选键只有唯一记录,因为没有历史属性产生新记录。此处取消复选框。
文章图片
g.继续下一步,会出现启用推断维度成员复选框。
推断维度成员:当运行事实表加载,维度成员不存在时。在加载期间会添加占位符记录。该案例没涉及到,此处不勾选,不详细说明了。
文章图片
h.继续下一步,渐变维控件会有六个输出。
1.NewOutput(新输出)
2.Changing Attribute Updates Output(改变属性更新输出)
3.Fixed Attribute Output(固定属性输出)
4.Historical Attribute Inserts Output(历史属性插入输出)
5.Inferred Member Updates Output(推断成员更新输出)
6.Unchanged Output(无改变输出)
此处只涉及两个输出
一.NewOutput:来自源的候选键在维度中没有匹配项,该输出将插入新的维度记录。
二.ChangingAttribute Updates Output:源候选键在维度中有一个匹配,且源中属性与维度中的属性不匹配的时候使用。
a.OLEDB目标如图所示,向DimSalesTerritory插入新数据
文章图片
b.OLEDB命令配置,如图所示,更新DimSalesTerritory中匹配的源候选键对应属性。
此处理解:通过匹配的SalesTerritoryAlternateKey候选键,根据源表中的输入列,来更新维表中对应的属性。
文章图片
文章图片
c.执行状态结果,如图所示
文章图片
总结
SCD是可以满足大多数维度ETL需求的工具,但是本身也存在缺点。在某些情况并不适合处理维度ETL。
主要缺点:
1.每一行的输入,每一行的更新都要向关系引擎发送新的查找。不能在内存中缓存维度表。可想而知,如果维度表以万计的话,性能问题很大。
2.插入目标没有被设置为快速加载,因为更新和插入之间可能会发生死锁。所以插入时,每次直插入一行,导致包执行慢。
3.设置好SCD后,如果再次打开向导并进行更改,将会自动丢失之前自定义设置。
优化:
1.在维度表中,给业务键创建索引。
2.如果不需要OLEDB命令转换控件,那么可以将插入目标更改为快速加载,而不是每行插入。
除了用SCD控件以外,还可以使用Sql Server 的Merge语句来实现渐变维度。
PS:以共享IT资源,畅游IT为核心组成的海贼团,每周不定期推送更新完整的项目文章详解以及经验分享,欢迎加入IT海贼船
黑胡子:“人的梦想,永远不会结束!”
文章图片
推荐阅读
- 销量搜索
- 真正高维度的人不会在心理世界存留低维度的负性痕迹
- 数据库|效率最高的Excel数据导入---(c#调用SSIS Package将数据库数据导入到Excel文件中【附源代码下载】)...
- 理解来访者,到底需要理解什么呢((三))
- “至简领导力之孝善断舍离055"之“链接高维度的解决方案”】(2115)
- 数据蒋堂|数据蒋堂 | JOIN延伸 - 维度其它应用
- 跟着白泽读paper丨kAFL:|跟着白泽读paper丨kAFL: Hardware-Assisted Feedback Fuzzing for OS Kernels
- DISC|DISC 的两个维度
- UI精品文章(从交互维度量化用户体验)
- React|React Native实现一个渐变进度条