SQL Server - READPAST,UPDLOCK 更新方法是什么?

5
我们需要进行另一次大规模更新,但由于存在严重的锁定问题风险,因此需要停机维护。基本上,我们希望在工作时间内更新数亿行数据。
现在,将更新分为可管理的小批量,例如每批不超过5000个可以有所帮助,但我在想是否可行创建一个模板,仅读取和锁定可用的行,更新它们,然后转移到下一批?这种方法的想法是,在最小化风险的情况下,我们可以使用此方法修补约95%的数据,然后在慢期间将剩余的数据集全部更新一次并注意锁定。
是的,我知道这听起来很奇怪,但请耐心听我说完。如何实现这一点?
我在想类似以下的东西:
WHILE @@ROWCOUNT > 0
BEGIN
   UPDATE TOP (5000) T
   SET T.VALUE = 'ASD'
   FROM MYTABLE T
   JOIN (SELECT TOP 5000 S.ID
      FROM MYTABLE S WITH (READPAST, UPDLOCK)
      WHERE X = Y AND Z = W etc...) SRC
         ON SRC.ID = T.ID
END

有什么想法吗?基本上,我不希望这个查询被其他潜在的长时间运行的事务卡住,或者反过来对其他人造成相同的影响。所以我在这里需要一个脚本,它将跳过锁定行,在最小风险涉及锁定或死锁的情况下更新它能够更新的内容,因此在正常运行期间的一小时左右可以安全地运行。

1个回答

4

对于单表更新,只需在表中添加WITH (READPAST)

UPDATE TOP (5000) MYTABLE WITH (READPAST)
SET VALUE = 'ASD'
WHERE X = Y AND Z = W etc...

如果你很幸运只涉及到一张表,你可以添加WITH (READPAST),UPDATE本身将对仅更新的行添加独占锁定。
如果涉及多个表,则可能变得更加复杂。同时要非常注意WHERE子句,因为这可能会增加比预期更多的负载 - 前几批是好的,但如果需要扫描整个表来查找足够的行以满足TOP,则会逐渐恶化。您可能需要考虑每个批次设置一个较短的超时值。

太棒了,回来测试了一下你的代码,它可以正常工作。非常感谢! - Kahn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接