SQL Server-READPAST、UPDLOCK更新方法?

SQL Server-READPAST、UPDLOCK更新方法?,sql,sql-server,sql-server-2012,locking,Sql,Sql Server,Sql Server 2012,Locking,我们还需要另一个大规模的更新,由于存在大量锁定问题的风险,因此需要停机。基本上,我们希望在工作时间内更新数亿行 现在,将更新减少到可管理的

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

现在,将更新减少到可管理的<5000批大小会有所帮助,但我想知道是否可以创建一个只读取和锁定可用行的模板,对它们进行udpate,然后继续下一批?我们的想法是,通过这种方式,我们可以以最小的风险修补大约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
有什么想法吗?基本上,我最不希望这个查询陷入其他可能长期运行的事务中,或者反过来对其他事务执行同样的操作。因此,我在这里寻找的是一个脚本,它将跳过锁定的行,以最小的风险更新它所能涉及的锁或死锁,这样它就可以在正常运行期间安全运行一小时左右。

只需将与(readpass)添加到表中,以进行单表更新:

UPDATE TOP (5000) MYTABLE WITH (READPAST)
SET VALUE = 'ASD'
WHERE X = Y AND Z = W etc...
如果幸运的是只涉及一个表,那么只需使用(readpass)添加即可,而更新本身将仅在更新的行上添加独占锁


如果涉及多个表,则可能会变得更复杂。还要非常小心WHERE子句,因为这可能会增加比预期更多的负载—前几个批处理很好,但如果需要扫描整个表以找到足够的行来满足顶部的要求,则情况会越来越糟。您可能想考虑每个批次的超时值。

真棒,回到这里,测试您的,它工作。非常感谢!