0

我在 sql server 中有一个表,由两个不同服务器中的 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], ...))

但这需要更多的时间。

任何其他可以更快并且可以节省时间的方法?

4

1 回答 1

0

这是一个很常见的问题。

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

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

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

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

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

祝你好运。

于 2020-02-06T17:59:10.233 回答