小编典典

如何使用SQL Server批量更新?

sql

我有一个包含一千万行的表,需要与另一个表连接并更新所有数据。一小时要花费超过1个小时的时间,这使我的事务日志增加了10+
GB。是否有另一种方法可以增强此性能?

我相信,每次更新后,都会检查索引和约束并记录所有信息。有没有一种方法可以告诉SQL Server仅在更新完成后才检查约束并最小化记录更新操作?

我的查询如下。我已经修改了一些名称,以便于阅读。

UPDATE o
SET o.Info1 = u.Info1, o.Info2 = u.Info2, o.Info3 = u.Info3
FROM Orders o
INNER JOIN Users u
ON u.ID = o.User_ID

编辑: 如注释中所述,表定义将类似于以下内容(再次简化以创建通用问题)。

表顺序

ID int PK
OrderNumber nvarchar(20)
User_ID int FK to table Users
Info1 int FK to table T1
Info2 int FK to table T2
Info2 int FK to table T3

表用户

ID int PK
UserName nvarchar(20)
Info1 int FK to table T1
Info2 int FK to table T2
Info2 int FK to table T3

阅读 422

收藏
2021-03-23

共1个答案

小编典典

首先,没有这样的BULK UPDATE事情,您可以做的一些事情如下:

  1. 如果可能,请在执行此操作之前将数据库置于简单恢复模式。
  2. 在执行更新之前删除索引,并在更新完成后再次创建它们。
  3. 进行小批量更新,例如
    WHILE (1=1)
    

    BEGIN
    – update 10,000 rows at a time
    UPDATE TOP (10000) O
    FROM Table O inner join … bla bla

    IF (@@ROWCOUNT = 0)
           BREAK;
    

    END

笔记

如果您选择了简单模式选项,则在将恢复模式切换回完全模式后,请不要忘记进行完整备份。由于只需将其切换回完全恢复模式,就不会进行日志记录,直到您进行了完全备份。

2021-03-23