我在sql server中有一个表,它包含两个不同服务器中的2亿条记录。我需要将此表从服务器1移动到服务器2。
服务器1中的表可以是服务器2中表的子集或超集。服务器1中的一些记录(大约1百万)已更新,我需要在服务器2中更新。因此,目前我正在关注此方法: -
1)使用SSIS将数据从服务器1移动到服务器2中的登台数据库。
2)然后将分段中的数据与服务器2中的表逐列进行比较。如果任何列不同,我会更新整行。
这需要花费很多时间。我尝试使用hashbytes来比较这样的行: - HASHBYTES(' sha',CONCAT(a。[account_no],a。[transaction_id],...))
<>
HASHBYTES(' sha',CONCAT(b。[account_no],b。[transaction_id],...))
但这需要更多时间。
任何其他可以更快并且可以节省时间的方法?
答案 0 :(得分:0)
这是一个很常见的问题。
首先-不要尝试直接在SQL中进行更新-性能将很糟糕,并且会使数据库服务器屈服。
在上下文中,TS1将是服务器1上的表,TS2将是服务器2上的表 使用SSIS-在作业中创建两个步骤: 首先,找到已删除的-按ID扫描TS2,然后删除TS1中不存在的任何TS2 ID。 其次,扫描TS1,如果该ID存在于TS2中,则需要更新该记录。如果有内存,SSIS可以检查差异并仅在需要时进行更新,否则,只需执行update语句即可。 在扫描TS1时,如果ID在TS2中不存在,则插入记录。
由于服务器架构的不同,我无法在性能上进行说明,但是分析200mm记录将需要大量计算。这将需要很长时间。
对于正在进行的执行,您将需要为每个记录添加一个“上次修改日期”时间戳,并需要一个触发器来对任何合法更改进行更新。然后使用它来过滤您的问题空间。第一次扫描不会很糟糕,因为它只会查看ID。假设要修改的记录数相对于整个数据集较小(<5%?),则插入/更新阶段实际上将从上次修改的日期过滤器中受益。您还需要向该列添加索引以帮助过滤。
另一种选择是每次执行刻录和加载-禁用TS2周围的任何约束,截断TS2并将数据从TS1复制到TS2,最后重新启用约束并重建任何索引。
祝你好运。