SSIS的Merge Join和Merge转换是两个类似的组件,用于将两个输入数据源合并为一个输出。本文解释了这两种转换,并说明了何时以及如何使用它们中的每一种。
- 注意:本文中的所有例子都是使用Stack overflow 2013数据库、SQL Server 2019、Visual Studio 2019、SQL Server集成服务项目扩展3.4版本制作的。
正如SSIS工具箱中提到的,SSIS合并转换 "将多个排序数据流中的行合并为一个排序数据流"。

图1 - SSIS工具箱中的合并转换描述
合并转换与Union All转换非常相似,后者将来自不同来源的行合并为一个输出。主要的区别是,Union All不要求数据源被排序,它的输出也不要求。此外,Union All接受两个以上的输入,而Merge转换则不接受。
在说明如何使用合并转换之前,我们将解释在SSIS中排序数据源的几种方法。
使用排序组件
排序组件是一种转换,当输入的数据在其源头无法被排序时,它将以升序或降序排序。这意味着--一般来说--在其源头对数据进行排序比使用这个组件要好。原因是,在源一级对数据进行排序会减少ETL服务器的工作量。此外,它可以从数据源的索引或其他辅助工具中受益。

图2 - SSIS工具箱中的排序组件描述
在SSIS工具箱中提到的一个重要说明是,对于大数据,不建议使用Sort组件,因为它需要在生成排序输出之前在内存中加载所有数据。
排序组件非常简单,易于使用;你需要指定排序操作中使用的列以及每个列的排序顺序。

图3 - 排序组件编辑器
请注意。删除重复的数据可能会导致数据丢失,因为重复的数据是根据排序列进行比较的,而不是整个数据行。

图4 - 使用合并转换的排序组件
使用高级编辑器
正如我们之前提到的,当它能在数据源处进行排序时,就没有必要使用排序组件。假设我们是从一个具有聚类索引的SQL Server表中读取数据(这意味着其主键列会对数据进行排序),或者我们在SQL命令中使用了ORDER BY子句。SSIS引擎不会自动检测到我们的数据源是否被排序,用户必须这样告诉它。
要处理一个被排序的数据源,我们应该打开源组件的高级编辑器*(右键单击>显示高级编辑器...)。*

图5 - 打开源组件的高级编辑器
在源组件的高级编辑器中,进入 "输入和输出属性 "标签。点击 "OLE DB源输出",将 "IsSorted "属性改为 "True"。

图6 - 将 "IsSorted "属性修改为 "True"
下一步是为排序操作中使用的所有列配置排序键的位置。

图7 - 配置排序键的位置
正如官方文档中提到的,"排序键位置 "属性的值应按如下方式配置。
- 整数值必须代表一个数字序列,从1开始并以1递增
- 一个正的整数值表示一个升序的排序顺序
- 一个负的整数值表示一个降序排序。(如果设置为负数,数字的绝对值决定了该列在排序序列中的位置)。
- 默认值为0表示该列没有被排序。对于不参与排序的输出列,保留0的值。
使用SSIS合并转换
为了说明SSIS合并转换,让我们假设我们需要将 "帖子 "和 "评论 "表中的所有数据插入到一个表中。为此,我们创建了一个SSIS包,添加了一个 "数据流任务",并配置了一个OLE DB连接到Stack Overflow 2013数据库。接下来,我们添加了两个OLE DB源组件,并为每个组件添加一个排序组件。然后,我们添加一个合并转换,将两个排序组件的输出作为输入。
如下面的图片所示,合并转换编辑器非常简单。你只需要指定组件的输出列和它们在每个输入中的对应列。

图8 - 合并转换编辑器
如下图所示,"ID "输出列是组件输出的排序键,它被映射到每个数据源的 "ID "列(排序键)。

图9 - 数据流任务截图
如果我们打开OLE DB目的地高级编辑器,我们可以检查Id列对合并转换输出的排序。

图10 - OLE DB目的地输入属性

图11 - ID列的SortKeyPosition属性
执行包后,我们可以注意到Merge变换输出行的数量等于两个输入行的总和。

图12 - 合并转换的输入和输出行数
SSIS合并连接转换
SSIS合并连接转换使用连接操作将两个排序的输入数据流合并为一个输出。支持三种连接操作。全连接、左连接和内连接。

图13 - SSIS工具箱中的SSIS合并连接转换描述
下面的图片显示,SSIS合并连接转换使用每个数据源中使用的排序键来连接两个输入。你可以从两个来源中选择输出列。

图 14 - SSIS 合并连接转换编辑器
由于右键连接没有被列在 "连接类型 "下拉列表中,你可以选择左键连接选项,并点击 "交换输入 "按钮,将输入从右边交换到左边,这相当于RIGHT OUTER JOIN操作。
SSIS合并连接转换的输出行根据选择的连接类型而不同。
- INNER JOIN:这种类型的连接返回那些在两个数据源中都有匹配值的行。
- LEFT OUTER JOIN:这种类型的连接返回来自左侧数据源的所有行和来自右侧数据源的所有匹配行。
- FULL JOIN: 这种类型的连接返回来自左边和右边数据源的所有匹配行。
SSIS合并连接与合并转换
SSIS合并连接和合并转换之间的区别就像SQL Server中的UNION和JOIN操作符之间的区别。两者都是用来合并来自两个数据源的行,但每一个都有自己的合并方式。合并转换用于合并行(如UNION操作),而SSIS合并连接转换则用于合并不同行之间的列(如SQL JOIN)。
总结
在这篇文章中,我们解释了SSIS Merge Join和Merge转换。我们还说明了如何配置它们。此外,我们解释了如何对数据源进行排序,因为这是SSIS中合并转换的一个要求。最后,我们解释了SSIS中两个合并组件的主要区别。