我正在尝试了解 SSIS,对此没有什么疑问。
我想比较 2 个表。其中一个表位于 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 万条记录,以某种随机顺序排列。
任务:我正在尝试比较源数据和目标数据。因为基于连接源和目标中的 id 列,源数据和目标数据之间始终存在 1 对 1 匹配
并对 Amount 列
进行比较,并将不匹配的记录存储在 sql server 数据库中,这样我就知道在这种情况下 Look up conversion
会起作用。
但是我有一些疑问:
1) 如果我从源和目标的查询中触发 select * 那么 2400 万条记录将保留在哪里? 在内存中?
2)在这种情况下我会遇到内存异常吗?
3)由于结果集(即)在源和目标中的顺序不同 查找有用吗? 是否会加载所有源数据,然后在目标中匹配 1 条记录 不加载整个目标数据来获取数据?
4) SSIS 如何处理源和目标的数百万数据比较?
有人可以帮我解答以上疑问吗?
最佳答案
如果您使用查找执行此操作,则两个行集都不会完全存储在内存中,除非您使用完整缓存。如果您使用缓存,那么目标数据将存储在内存中,当然,如果您没有足够的可用内存,您可能会遇到内存异常。
查找是一个糟糕的主意,因为对于源数据中的每一行,您都将查询目标数据。因此,在完成之前,您将针对目标发出 1200 万个单独的查询。这是性能最差的选项。
合并联接速度更快,因为您的数据是根据匹配键预先排序的,因此匹配速度要快得多。而且这两个数据集都不需要保存在内存中。行自由流动,无需等待整个数据集加载。
Here是 Lookup 和 Merge Join 之间的比较。
最快的选择是将目标数据直接加载到与源数据位于同一服务器上的临时表,并在连接键上索引该表。然后您可以在 SQL 中进行比较,连接索引列,这将为您提供最快的性能。
关于sql-server - SSIS 具有数百万数据可从源和目标进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48645190/