sql-server - SSIS 具有数百万数据可从源和目标进行比较

标签 sql-server ssis etl data-comparison

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

相关文章:

sql-server - SharePoint 列表与数据库表性能

sql-server - 加速 SSIS 包(插入和更新)

sql-server - SSIS 与 Oracle Data Integrator

sql-server - 将 DDMonYY 和时间转换为 SSIS 包中的日期时间列(派生列)

timeout - Talend - 超出锁定等待超时

sql - 如何将数据分成两列

sql-server - SQL FOR XML PATH 列表和 COUNT

sql-server - SSIS 数据传输添加字符(SQL Server 到 Postgres)

sql-server - 如何使用 FTP 任务为 SSIS 包配置 Azure VM

sql - 重构——两条可怕的线