【问题标题】:SQL Server - READPAST, UPDLOCK update method?SQL Server - READPAST、UPDLOCK 更新方法?
【发布时间】:2014-08-01 07:41:47
【问题描述】:

我们需要另一个大规模更新,因为存在大量锁定问题的风险,因此需要停机。基本上,我们希望在工作时间更新数亿行。

现在,将更新减少到可管理的

是的,我知道这听起来很奇怪,但请耐心等待。怎么做呢?

我在想这样的事情:

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

有什么想法吗?基本上,我想要的最后一件事是让这个查询卡在其他可能长时间运行的事务中,或者作为回报对其他人做同样的事情。所以我在这里寻找的是一个脚本,它将跳过锁定的行,更新它可以最小化涉及锁定或死锁的风险,因此它可以在正常运行期间安全地运行一个小时左右。

【问题讨论】:

    标签: sql sql-server sql-server-2012 locking


    【解决方案1】:

    只需将 WITH (READPAST) 添加到表中即可进行单表更新:

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

    如果您足够幸运,涉及到一个表,您可以添加 WITH (READPAST),而 UPDATE 本身将只对要更新的行添加排他锁。

    如果涉及多个表,则可能会变得更加复杂。还要非常小心 WHERE 子句,因为这可能会增加比预期更多的负载 - 前几批很好,但如果需要扫描整个表以找到足够的行来满足 TOP,则会逐渐变得更糟。您可能需要考虑为每个批次设置一个较短的超时值。

    【讨论】:

    • 太棒了,回到这个,测试你的,它工作。非常感谢!
    猜你喜欢
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-25
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多