针对非常大的目标表的查找转换

时间:2016-02-08 21:11:42

标签: ssis

我正在创建一个SSIS包,它本质上试图查找表A中表B中没有的所有行。连接列是表A中的标识列,它是聚簇索引,表B中的列不是身份,但已编入索引。而且我一次批量处理10,000行。表A和表B都有大约350M行。

我最初认为Lookup转换是合适的,但我不能使用Full Cache,因为它试图在缓存中加载350M行!如果我使用No Cache,那么只查找10,000行的过程非常慢(即使表B中的查阅列已编入索引)。

此外,表A和表B位于两个不同服务器上的两个不同数据库中。

是否有另一种转变更适合我想要做的事情?

使用SQL Server 2014。

1 个答案:

答案 0 :(得分:1)

您可以尝试在数据流任务中合并连接组件。

  • 将两个数据源组件放到IDE上;
  • 假设您正在使用sql命令,请确保您的查询结果按连接列排序;
  • 在高级模式下打开数据源组件,在输入和 输出属性选项卡,将输出设置为sorted(isSorted = true), 然后为连接列设置SortKeyPosition为1;
  • 然后删除Merge Join组件并将两个数据源组件链接到它。
  • 打开Merge Join组件并将连接类型更改为left join,和 勾选您想要的列;
  • 最后删除条件拆分组件以通过连接列拆分输出行。因为我们在Merge Join组件中使用Left Join,所以ISNULL(连接列)== True是您正在寻找的

实际上,在处理大量行时,您可以尝试其他一些方法来提高性能,例如将两个表导入到sql join的临时数据库中,因为set操作通常比逐行进程快。