针对非常大的目标的查找转换 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 连接,因为集合操作通常比行操作更快按行处理。
我正在创建一个 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 连接,因为集合操作通常比行操作更快按行处理。