我正在尝试了解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
这只是一些样本记录,因为我在源(12百万)和目标(12百万)中有一些随机顺序的记录。
任务:我正在尝试比较源数据和目标数据。因为基于joining id column from source and target
的源数据和目标数据之间始终存在1对1匹配并且在{{1}上进行比较并在sql server数据库中存储不匹配的记录,所以我知道Amount column
在这种情况下会这样做。
但是我有些疑惑:
1)如果我从查询中选择*来源和目标那么2400万条记录将留在哪里? 记忆中?
2)在这种情况下,我可以获得内存异常吗?
3)因为结果集(即)在源和目标中的顺序不同 查找会起作用吗? 它会加载所有源数据,然后它将匹配目标中的1对1记录 数据不加载整个目标数据?
4)SSIS如何处理源和目标的数百万次数据比较?
有人可以帮我解决疑惑吗?
答案 0 :(得分:4)
如果使用Lookup执行此操作,则除非使用完全缓存,否则任何行集都不会完全存储在内存中。如果您使用缓存,那么目标数据将存储在内存中,当然,如果您没有足够的可用内存,则可能会出现内存异常。
查找是一个糟糕的主意,因为对于源数据中的每一行,您将查询目标数据。因此,在完成之前,您将针对目标发出1200万个单独的查询。这是表现最差的选择。
合并连接速度更快,因为您的数据已在匹配键上预先排序,因此匹配速度更快。此外,两个数据集都不需要保存在内存中。行无需等待整个数据集加载即可自由流动。
Here是Lookup和Merge Join之间的比较。
最快的选择是将目标数据直接加载到与源数据相同的服务器上的登台表中,并在连接键上索引该表。然后,您可以在SQL中进行比较,加入索引列,这将为您提供最快的性能。
答案 1 :(得分:1)
除了Tab的答案之外,OP还询问SSIS如何在不加载整个数据集的情况下执行数百万条记录从源到目标的比较'
答案:
请记住,Merge Join
仅采用有序输入。
合并将按照您提供的顺序遍历两组 您的输入或使用排序转换。因此,它加载一条记录 来自第二个输入的一个输入和一个记录。如果是钥匙 匹配,它将输出包含来自两个输入的信息的行。该 优点是 SSIS只需要在内存中保留几行。
如果微软决定不要求排序怎么办? 然后,为了使Merge工作,它将加载所有的 从一个输入到内存的行,然后合并将查找 在内存中排。这意味着需要大量的内存。
来源:msdn