如何使用SQL Server进行批量更新?

4
我有一个包含一千万行数据的表,需要与另一个表连接并更新所有数据。这个操作需要超过一个小时,并且会导致事务日志增加十多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

我看到了很多标题类似的问题,但是没有一个尝试使用SQL来改进(只是用C#代码)。 - JoJo
请尝试批量处理。您能否包含“订单”和“用户”的表定义? - Felix Pamittan
@wewesthemenace,我已经根据您的要求更新了问题。您提出的批量更新的想法是否可以使用像M.Ali答案中那样的循环来实现? - JoJo
是的,那就是它。 - Felix Pamittan
2个回答

9

首先,不存在所谓的 BULK UPDATE,以下是您可以执行的一些操作:

  1. If possible put your database in simple recovery mode before doing this operation.
  2. Drop indexes before doing update and create them again once update is completed.
  3. do updates in smaller batches , something like

    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
    

注意

如果你选择简单模式选项,切换回完整恢复模式后不要忘记进行完整备份。因为仅仅将其切换回完整恢复模式并不能开始记录,直到你进行完整备份。


0
对于我的情况,按需加载数据(Dotnet winform),并尝试创建一个新表,应用批量操作,并通过批量表连接更新基本表!对于100万行数据,大约需要5秒钟。

完整的源代码在哪里?创建新的表,应用批量操作并通过批量表进行连接? - Kiquenet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接