如何使用SQL Server批量更新?

问题描述 投票:3回答:2

我有一个包含1000万行的表,我需要将其与另一个表连接并更新所有数据。一小时要花费超过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

[EDIT:如评论中的要求,表定义将类似于以下内容(再次简化以创建通用问题)。

表格顺序

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 sql-server sql-update sqlperformance
2个回答
6
投票

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

如果使用简单模式选项,将恢复模式切换回完全模式后,请不要忘记进行完整备份。由于只需将其切换回完全恢复模式就不会分层记录日志,除非您进行了完全备份。


0
投票

对于我来说,根据需要加载数据(Dotnet winform),并尝试创建一个新表,应用批量并使用批量表连接来更新基本表!对于1M行,我大约需要5秒钟]]

© www.soinside.com 2019 - 2024. All rights reserved.