在 sql 服务器中比较多个列值的最快方法?



我在sql服务器中有一个表,其中包含两个不同服务器中的2亿条记录。我需要将此表从服务器 1 移动到服务器 2。

服务器1 中的表可以是服务器 2 中表的子集或超集。服务器 1 中的一些记录(大约 100 万条(已更新,我需要在服务器 2 中更新。所以目前我正在遵循这种方法:-

1( 使用 SSIS 将数据从服务器 1 移动到服务器 2 中的临时数据库。

2(然后将暂存中的数据与服务器2中的表逐列进行比较。如果任何列不同,我将更新整行。

这需要很多时间。我尝试使用哈希字节来比较这样的行:- HASHBYTES('sha',CONCAT(a.[account_no],a.[transaction_id], ...((

<>

HASHBYTES('sha',CONCAT(b.[account_no],b.[transaction_id], ...((

但这需要更多时间。

还有其他方法可以更快并节省时间吗?

这是一个很常见的问题。

首先 - 不要尝试直接在SQL中进行更新 - 性能会很糟糕,并且会使数据库服务器瘫痪。

在上下文中,TS1 将是服务器 1 上的表,TS2 将是服务器 2 上的表 使用 SSIS - 在作业中创建两个步骤: 首先,找到已删除的 - 按 ID 扫描 TS2,以及 TS1 中不存在的任何 TS2 ID,将其删除。 其次,扫描 TS1,如果 TS2 中存在该 ID,则需要更新该记录。如果内存可用,SSIS 可以检查差异,并且仅在需要时进行更新,否则,只需执行 update 语句。 扫描 TS1 时,如果 TS2 中不存在该 ID,则插入记录。

由于作为服务器的模式变化,我无法谈论这方面的性能,但是分析 200 毫米记录将是计算密集型的。这将需要很长时间。

对于正在进行的执行,您需要向每条记录添加一个"上次修改日期"时间戳,以及一个触发器,以便在任何合法更改时更新字段。然后使用它来过滤掉你的问题空间。第一次扫描不会很糟糕,因为它只查看 ID。插入/更新阶段实际上将受益于上次修改日期筛选器,假设要修改的记录数相对于整个数据集较小(<5%?(。您还需要向该列添加索引以帮助进行筛选。

另一种选择是每次都执行刻录和加载 - 禁用 TS2 周围的任何约束,截断 TS2 并将数据从 TS1 复制到 TS2,最后重新启用约束并重建任何索引。

祝你好运。

最新更新