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

Sql server SSI具有数百万数据,可从源和目标进行比较,sql-server,ssis,etl,data-comparison,Sql Server,Ssis,Etl,Data Comparison,我正在努力学习SSIS,对此几乎没有疑问 我想比较两个表。一个表在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万条记录,以某种随

我正在努力学习SSIS,对此几乎没有疑问

我想比较两个表。一个表在
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万条记录,以某种随机顺序排列

任务:我正在尝试比较源数据和目标数据。因为源数据和目标数据之间总是会有1对1的匹配,这是基于
从源数据和目标数据连接id列
,对
金额列
进行比较,并在sql server数据库中存储不匹配的记录,以便我知道
查找在这种情况下,转换

但我有一些疑问:

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

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

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

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


有谁能帮我澄清上述疑问吗?

如果您通过查找来完成此操作,则两个行集都不会完全存储在内存中,除非您使用完全缓存。如果使用缓存,那么目标数据将存储在内存中,当然,如果没有足够的可用内存,可能会出现内存异常

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

合并联接速度更快,因为您的数据在匹配键上进行了预排序,所以匹配速度更快。而且两个数据集都不需要保存在内存中。行自由流动,无需等待加载整个数据集

是查找和合并联接之间的比较


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

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

答复:

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

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

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


资料来源:

你打算如何处理这些数据?“比较”在SQL中不是一个真正的术语。@JacobH我将在数据库中存储不匹配的数据,但这是次要的。在此之前,我想了解有关SSI的情况,在进行研究时,我有一些疑问,我在问题中提出了这些疑问。您的疑问的答案是“这取决于”既然你还没有真正描述你想做什么,答案仍然是“这取决于”。。。没有“比较”这回事。SSI可以选择一百万或2400万行。SSIS具有缓存选项。使用的内存量取决于查询的数据量。几乎所有的答案都是“视情况而定”,除非你有更多的信息给我们。@JacobH我更新了我的问题,现在它显示了我想做的事情,你没有提供足够的信息来得到比“视情况而定”更好的答案,但我要告诉你,使用查找来比较1200万行和1200万行是一个糟糕的主意。合并加入会更好,但您最好的解决方案是导入到暂存表并在那里进行比较。我对您帮助我所做的努力投了赞成票。那么SSIS如何在不加载整个数据集的情况下从源到目标执行数百万条记录的比较呢?请您解释一下这一部分,因为我很长一段时间都不理解,我没有看到@塔巴勒曼写了很长的答案:)很好的解释+1个好主意。仅将主要匹配列移动到同一个DB以进行比较,从而避免左外部联接和同时带来所有行。