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



我正在尝试了解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

这只是一些示例记录,因为我有2400万记录(1200万(和目标(1,100万(。

task :我正在尝试比较源和目标数据。由于基于joining id column from source and target,源和目标数据之间总是有1到1匹配,并且对Amount column进行比较,并在SQL中存储不匹配记录服务器数据库,所以我知道Look up transformation在这种情况下会做。

但是我有一些疑问:

1(如果我从查询中启动 * select *以获取源和目标,那么2400万记录将留在哪里? 在记忆中?

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

3(由于结果集(即(在源中的顺序不同,并且针对 查找会起作用吗? 它将加载所有源数据,然后它将在目标中匹配1乘1记录 通过不加载整个目标数据来数据?

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

任何人都可以帮助我清除疑问吗?

如果您使用查找来执行此操作,则除非使用完整的缓存,否则两个行集将完全存储在内存中。如果您使用缓存,则目标数据将存储在内存中,当然,如果您没有足够可用的内存,则可以获得内存异常。

查找是一个可怕的想法,因为对于源数据中的每个行,您都将要查询目标数据。因此,在完成之前,您将针对目标发出1200万个个人疑问。这是表现最差的选项。

合并加入更快,因为您的数据已在匹配键上预选,因此匹配速度要快得多。同样,这两个数据集都不需要保存在内存中。行自由流动而无需等待整个数据集加载。

这是查找和合并加入之间的比较。

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

除了选项卡的答案外,op询问'SSIS如何执行数百万记录的比较,而不是加载整个数据集,而无需加载整个数据集'

答案:

记住,Merge Join仅进行分类输入。

合并将按照您屈服的顺序浏览两套 您的输入或使用排序转换。因此,它加载了一个记录 从第二个输入中的一个输入和一个记录。如果钥匙 匹配,它将输出来自两个输入的信息。这 优势是 SSIS仅需要在内存中保留几行

Microsoft决定不需要分类怎么办? 然后为了合并工作,它将加载所有 从一个输入到内存的行,然后合并将查找 在内存中行。这意味着需要大量内存。

来源:MSDN

最新更新