【发布时间】:2017-11-07 17:53:27
【问题描述】:
我有以下疑问:
update largeTable
set largeTable_id ='NA';
如果我们谈论 45m 记录表,我想知道执行此类更新的最佳做法是什么。我应该考虑级联更新吗?还是自动完成?
我以以下查询为例,分批执行更新以避免 tlog 空间问题:
DECLARE @i INT=1
WHILE (@i <= 10)
BEGIN
UPDATE TOP(20000) largeTable
SET largeTable_id = 'NA'
SET @i = @i + 1
END
所以,这就是想法,任何意见或建议将不胜感激。
提前致谢:)。
添加一个新想法:
--T-SQL using the ROWCOUNT setting to control update size
SET ROWCOUNT 1000
WHILE (1 = 1)
BEGIN
BEGIN TRANSACTION
UPDATE tableB
SET TableB_TableA_id = 'NA';
IF @@ROWCOUNT = 0
BEGIN
COMMIT TRANSACTION
BREAK
END
COMMIT TRANSACTION
END
SET ROWCOUNT 0
主要目标是在多个批次中执行该更新以避免 tlog 数据文件中的问题,并执行级联更新而不会出现性能问题。
【问题讨论】:
-
我认为您的示例中缺少 = 。
-
分批执行此操作是个好主意。但是,您正在更新前 20000 行,但没有指定顺序,因此您可能会更新相同的 20,000 行 10 次。我建议在其中添加一个 where 子句。并使用 while @@ROWCOUNT > 0 代替固定数量的迭代。当然,您的 SET 中缺少等号
-
避免不必要的更新总是一个好主意 - 所以添加“where isnull(largeTable_id, '') 'NA'” - 以防这些值确实存在。
-
是的,很抱歉缺少=:
-
你的例子中的外键是什么?
标签: sql-server tsql migration