0

所以,我遇到了一些代码,这些代码应该可以帮助我通过批量更新一个庞大的表(100m+ 条记录),如下所示:

--Declare variable for row count
set rowcount 50000
go

Declare @rc int
Set @rc=50000

While @rc=50000
 Begin

  Begin Transaction

  --Use tablockx and holdlock to obtain and hold 
  --an immediate exclusive table lock. This unusually
  --speeds the update because only one lock is needed.

    update  MyTable With (tablockx, holdlock)
    set TestField='ABC'

    ----Get number of rows updated
    ----Process will continue until less than 50000
    select @rc=@@rowcount


  Commit
 End

问题是,这进入了一个无限循环,一直打印(受影响的 50000 行)直到结束。顺便说一句,如果表中的记录少于 50000 条,则上面的代码会正确退出。有人知道怎么修这个东西吗?

谢谢

4

1 回答 1

3

如果 MyTable 中有 50000 条或更多记录,则它将始终更新。您的更新中没有 where 子句可以缩小字段范围,最终让您更新到 <50000 条记录。

大概您打算只更新 TestField <> 'ABC' 的记录,因此您没有再次执行相同的更新。

当您考虑使用什么 where 子句时,请考虑使用聚集索引,以便您可以对更新执行索引查找/部分扫描,而不是全表扫描。

顺便说一句,不需要HOLDLOCK提示,因为它在事务提交后立即释放,也不需要显式事务,因为更新本身就是一个事务。tabblock 可能会产生轻微的改进,因为它避免了锁升级。

于 2012-05-10T15:21:15.983 回答