如何批量更新 SQL 服务器?

How to Bulk Update with SQL Server?

我有一个包含 1000 万行的 table,我需要与另一个 table 连接并更新所有数据。这花费了 1 个多小时,并且使我的事务日志增加了 10+ GB。还有其他方法可以提高这种性能吗?

我相信每次更新后,都会检查索引和约束并记录所有信息。有没有办法告诉 SQL 服务器仅在更新完成后检查约束并最少记录更新操作?

我的查询如下。我修改了一些名称,使其更易于阅读。

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

编辑: 如评论中所问,table 定义类似于以下内容(再次简化以创建一个通用问题)。

Table 订单

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

Table 用户

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

首先,没有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
    

备注

如果您使用简单模式选项,请不要忘记在将恢复模式切换回完整模式后进行完整备份。因为简单地将其切换回完全恢复模式将不会在您进行完全备份之前进行日志记录。

对于我的情况,根据需要加载数据 (Dotnet winform),并尝试创建一个新的 table,应用批量并通过批量连接 table 更新基本 table! ,对于 1M 行,我大约需要 5 秒