首页 文章

SSIS具有数百万个数据,可以从源和目标进行比较

提问于
浏览
4

我正在尝试了解SSIS,并对此毫无疑问 .

我想要比较2个表.1表在 Sql Server 中,另一个在 Oracle 中 .

两个表都具有相同的模式,如下所示:

Sql Server:
Id      Amount
1       100
2       200
3       300


Oracle:
Id      Amount
3       3000
2       2000
1       1000

这只是一些样本记录,因为我在源(1200万)和目标(12百万)中有一些随机顺序的记录 .

Task :我正在尝试比较源数据和目标数据 . 因为基于 joining id column from source and target 的源数据和目标数据之间始终存在1比1匹配,并且在 Amount column 上进行比较并在sql server数据库中存储不匹配记录,所以我知道 Look up transformation 将在此处执行此操作案件 .

但是我有些疑惑:

1)如果我从查询中选择*来源和目标那么24百万条记录将留在哪里?在记忆中?

2)在这种情况下,我可以获得内存异常吗?

3)因为结果集(即)在源和目标中的顺序不同,所以查找是如何工作的?它会加载所有源数据,然后通过不加载整个目标数据来匹配目标数据中的1对1记录吗?

4)SSIS如何处理源和目标的数百万次数据比较?

有人可以帮我清除以上疑惑吗?

2 回答

  • 3

    如果使用Lookup执行此操作,则除非使用完全缓存,否则任何行集都不会完全存储在内存中 . 如果使用缓存,则目标数据将存储在内存中,当然,如果没有足够的可用内存,则可能会出现内存异常 .

    查找是一个糟糕的想法,因为对于源数据中的每一行,您将查询目标数据 . 因此,在完成之前,您将针对目标发出1200万个单独的查询 . 这是表现最差的选择 .

    合并连接更快,因为您的数据在匹配键上预先排序,因此匹配更快 . 此外,两个数据集都不需要保存在内存中 . 行无需等待整个数据集加载即可自由流动 .

    Here是Lookup和Merge Join之间的比较 .

    最快的选择是将目标数据直接加载到与源数据相同的服务器上的登台表中,并在连接键上索引该表 . 然后,您可以在SQL中进行比较,加入索引列,这将为您提供最快的性能 .

  • 1

    除了Tab的答案之外,OP还询问'SSIS如何在不加载整个数据集的情况下执行从源到目标的数百万条记录比较'

    回答:

    请记住, Merge Join 仅接受排序输入 .

    Merge将按照您在输入中提供的顺序或使用Sort转换遍历两组 . 因此,它从一个输入加载一个记录,从第二个输入加载一个记录 . 如果键匹配,它将输出包含来自两个输入的信息的行 . 优点是SSIS只需要在内存中保留几行 . 如果微软决定不要求排序怎么办?然后,为了让Merge工作,它会将所有行从一个输入加载到内存中,然后Merge将在内存中查找该行 . 这意味着需要大量内存 .

    来源:msdn

相关问题