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

Lookup transformation against very large target table

我正在创建一个 SSIS 程序包,它主要尝试查找 Table A 中不在 Table B 中的所有行。连接列是 Table A 中的标识列那是聚集索引和 Table B 中的一列,它不是标识,但已编入索引。我一次分批处理 10,000 行。 table A 和 table B 都有大约 350M 行。

我最初认为查找转换是合适的,但我不能使用完整缓存,因为它试图在缓存中加载 350M 行!如果我使用无缓存,仅查找 10,000 行的过程会非常慢(即使 Table B 中的查找列已编入索引)。

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

是否有其他转换更适合我想做的事情?

使用 SQL Server 2014。

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

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

实际上当处理大量行时,您可以尝试一些其他方法来提高性能,例如将两个表导入到临时数据库中以进行 sql 连接,因为集合操作通常比行操作更快按行处理。