【问题标题】:Lookup transformation against very large target table针对非常大的目标表的查找转换
【发布时间】:2016-02-08 21:11:41
【问题描述】:

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

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

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

还有其他更适合我想做的转换吗?

使用 SQL Server 2014。

【问题讨论】:

    标签: ssis


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2016-07-03
      • 2011-11-27
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-08
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多