我有一个包含一千万行的表,需要与另一个表连接并更新所有数据。一小时要花费超过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
首先,没有这样的BULK UPDATE事情,您可以做的一些事情如下:
BULK UPDATE
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
笔记
如果您选择了简单模式选项,则在将恢复模式切换回完全模式后,请不要忘记进行完整备份。由于只需将其切换回完全恢复模式,就不会进行日志记录,直到您进行了完全备份。