我试图在合理的时间内更新一个包含大约 650 万行的表,但我遇到了一些问题。我们正在向现有表中添加一个新列,然后根据另一个表中的列中的数据为所有行设置一个值。
UPDATE TOP (20000) c
SET c.NewColumn = ISNULL(p.Col1, p.Col2)
FROM dbo.Child c
INNER JOIN dbo.Parent p on c.FKId = p.Id
WHERE c.NewColumn IS NULL
在一个循环中,就像这篇文章。2.5 小时后更新仍在运行。我想知道禁用索引是否dbo.Child
会产生影响。NewColumn 没有索引,也不会,但是上面还有其他索引(大约5个)dbo.Child
SQL Server 是否足够聪明,可以看到它不需要更新其他索引(因为它们不是 UPDATE 的一部分),或者我们是否会在执行更新语句时从暂时禁用索引中受益?
这是 SQL Server 2012,但有问题的数据库处于 2008 兼容模式。