我对锁和提示相当新.
我有一张非常频繁SELECT
和INSERT
操作的桌子.该表有1100万条记录.
我已经添加了一个新列,我需要将数据从同一个表中的现有列复制到新列.
我打算使用ROWLOCK
提示来避免将锁升级到表级锁并阻止表上的所有其他操作.例如:
UPDATE SomeTable WITH (ROWLOCK) SET NewColumn = OldColumn
问题:
会NOLOCK
不是ROWLOCK
?请注意,一旦将记录插入表中,OldColumn的值就不会更改,因此NOLOCK
不会导致脏读.
难道NOLOCK
甚至意义在这种情况下,因为SQL Server将不得不反正获得更新锁UPDATE
.
有没有更好的方法来实现这一目标?
我知道要避免使用提示,SQL Server通常会做出更明智的选择,但我不希望在此更新期间锁定表.
尝试批量更新。
DECLARE @Batch INT = 1000 DECLARE @Rowcount INT = @Batch WHILE @Rowcount > 0 BEGIN ;WITH CTE AS ( SELECT TOP (@Batch) NewColumn,OldColumn FROM SomeTable WHERE NewColumn <> OldColumn OR (NewColumn IS NULL AND OldColumn IS NOT NULL) ) UPDATE cte SET NewColumn = OldColumn; SET @Rowcount = @@ROWCOUNT END