首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更新sql server中的大型表

更新sql server中的大型表
EN

Database Administration用户
提问于 2018-07-24 12:11:39
回答 1查看 3.7K关注 0票数 1

我有一个宽表(80列),其中有7000万行。目前,我可以尝试在表中的所有行中设置外键。

在整个表上使用update语句,例如:

代码语言:javascript
复制
BEGIN TRAN
UPDATE Cx
SET Cx.CohortId = Chx.CohortId
FROM Customers Cx
INNER JOIN Cohorts Chx ON Chx.NameField = Cx.NameField
COMMIT TRAN

我被告知这有可能填充事务日志(请注意,恢复模式目前设置为simple),最好对更新进行批量处理:

分批进行两次更新

代码语言:javascript
复制
DECLARE @Rows INT,
    @BatchSize INT; 

SET @BatchSize = 20000;
SET @Rows = @BatchSize; 

WHILE (@Rows = @BatchSize)
BEGIN
UPDATE TOP(@BatchSize) Cx
SET Cx.CohortId = Chx.CohortId
FROM Customers Cx
INNER JOIN Cohorts Chx ON Chx.NameField = Cx.NameField
WHERE Cx.CohortId IS NULL -- Do not update records that have already been uplifted to include the FK

SET @Rows = @@ROWCOUNT
END

第二种方法对大型表更新的事务日志有什么好处吗?

EN

回答 1

Database Administration用户

发布于 2018-07-24 13:18:08

我被告知这有可能填充事务日志。。。更好的方法是批量更新

如果它不填充事务日志,情况会更好。但建议的补救措施是错误的。

您应该调整事务日志的大小以支持事务,而不是相反。

第二种方法对大型表更新的事务日志有什么好处吗?

是。只要所有批处理都不在事务中,事务日志就可以在批处理之间重用。

增加磁盘空间以支持这将是很麻烦的

是的,有时候你确实需要围绕空间问题进行编码,但是编码并不是免费的。将资金花在基础设施上以减少编码时间通常是明智的做法。

另外,如果您试图最小化日志空间,请考虑在查询中加载一个空表,然后执行ALTER…。换一下。加载新表可以最少记录,而ALTER是元数据操作。

这还将使您能够在事务中执行操作,而不是提交中间结果。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/213081

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档