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

如何使用SQL Server进行批量更新?,sql,sql-server,sql-update,sqlperformance,Sql,Sql Server,Sql Update,Sqlperformance,我有一个包含1000万行的表,需要与另一个表连接并更新所有数据。这花费了1个多小时,并且使我的事务日志增加了10+GB。有没有其他方法可以提高这种性能 我相信在每次更新之后,都会检查索引和约束,并记录所有信息。是否有一种方法可以告诉SQL Server仅在更新完成后检查约束,并尽可能少地记录更新操作 我的问题如下。我修改了一些名字,以便更容易阅读 UPDATE o SET o.Info1 = u.Info1, o.Info2 = u.Info2, o.Info3 = u.Info3 FROM O

我有一个包含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
编辑:如注释中所述,表格定义如下(再次简化以创建一般问题)

表顺序 表用户
首先,没有批量更新,您可以做以下几件事:

  • 如果可能,请在执行此操作之前将数据库置于简单恢复模式
  • 在执行更新之前删除索引,并在更新完成后再次创建索引
  • 进行小批量的更新,比如

    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),然后尝试创建一个新表,应用bulk并使用join by bulk table更新基本表!,对于100万行,我花了大约5秒钟的时间

    我看到了十几个标题类似的问题,但没有一个问题试图使用SQL(仅使用C#代码)进行改进。试着分批进行。你能把
    订单
    用户
    的表格定义包括在内吗?@wewewesthemenance,我已经根据你的要求更新了这个问题。你对批量更新的想法是使用一个像M.Ali回答这样的循环?是的,就是这样。关于它的完整源代码?创建新表、应用批量和按批量联接表?
    ID int PK
    UserName nvarchar(20)
    Info1 int FK to table T1
    Info2 int FK to table T2
    Info2 int FK to table T3
    
    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