当前位置:  开发笔记 > 数据库 > 正文

如何避免UPDATE语句在更新大量记录时锁定整个表

如何解决《如何避免UPDATE语句在更新大量记录时锁定整个表》经验,为你挑选了1个好方法。

我对锁和提示相当新.

我有一张非常频繁SELECTINSERT操作的桌子.该表有1100万条记录.

我已经添加了一个新列,我需要将数据从同一个表中的现有列复制到新列.

我打算使用ROWLOCK提示来避免将锁升级到表级锁并阻止表上的所有其他操作.例如:

UPDATE 
    SomeTable WITH (ROWLOCK)
SET
    NewColumn = OldColumn

问题:

    NOLOCK不是ROWLOCK?请注意,一旦将记录插入表中,OldColumn的值就不会更改,因此NOLOCK不会导致脏读.

    难道NOLOCK甚至意义在这种情况下,因为SQL Server将不得不反正获得更新锁UPDATE.

    有没有更好的方法来实现这一目标?

我知道要避免使用提示,SQL Server通常会做出更明智的选择,但我不希望在此更新期间锁定表.



1> pacreely..:

尝试批量更新。

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

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有