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 万)和目标(1200 万)中有 2400 万条随机顺序的记录。

任务joining id column from source and target:我正在尝试比较源数据和目标数据。因为源数据和目标数据之间始终存在 1 对 1 匹配,Amount column因此我知道Look up transformation在这种情况下会这样做。

但是,我有一些疑问:

1) 如果我从源和目标的查询中触发 select *,那么 2400 万条记录将保留在哪里?在记忆中?

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

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

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

任何人都可以帮我消除以上疑虑吗?

4

2 回答 2

4

如果您使用 Lookup 执行此操作,则两个行集都不会完全存储在内存中,除非您使用完整缓存。如果您使用缓存,那么目标数据将存储在内存中,当然,如果您没有足够的可用内存,您可能会遇到内存异常。

查找是一个糟糕的主意,因为对于源数据中的每一行,您都将查询目标数据。因此,您将在完成之前针对目标发出 1200 万个单独的查询。这是性能最差的选项。

Merge Join 速度更快,因为您的数据已根据匹配键预先排序,因此匹配速度更快。同样,两个数据集都不需要保存在内存中。行自由流动,无需等待加载整个数据集。

是 Lookup 和 Merge Join 之间的比较。

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

于 2018-02-06T15:00:15.753 回答
1

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

回答:

记住,Merge Join只接受排序的输入。

合并将按照您在输入中给出的顺序或使用排序转换遍历两个集合。因此,它从一个输入加载一条记录,从第二个输入加载一条记录。如果键匹配,它将输出包含来自两个输入的信息的行。优点是SSIS 只需要在内存中保留几行

如果 Microsoft 决定不需要排序怎么办?然后,为了让 Merge 工作,它会将所有行从一个输入加载到内存中,然后 Merge 会在内存中查找该行。这意味着需要大量内存。

来源:msdn

于 2018-02-07T06:03:29.213 回答