我想将 SQL-Server 数据库中某些表(而非全部)的所有值设置为NULL 。问题是,该表有超过30.000.000行,并且更新所有列/行需要很长时间。 如何加快以后的更新声明?
Update Table
Set
column1 = null,
column4 = null,
column8 = null,
column12 = null
不可能放弃桌子!
答案 0 :(得分:6)
问题是,该表有超过30.000.000行 需要很长时间才能更新所有列/行。我怎样才能加快速度 以下更新声明?
您购买速度更快的服务器。
严重。
无法删除表格。必须在一个语句中更新3000万行。
这两方面都是不可改变的。没有太多可能的优化(你可以杀死那些字段上的任何索引然后重新创建它们)。剩下的就是获得更好的硬件。
对不起,没有更好的答案。您可以尝试在循环中一次更新10000次 - 这会使事务和语句更快,但我怀疑它会使整个操作更快,这是您的问题所在。最后必须完成工作,如果需要更快地完成,那么你需要更多的力量=更快的服务器。
答案 1 :(得分:5)
如果列位于表的末尾,或者列的顺序不相关,我认为最快的方法是删除列并重新创建它们
-- assumes no constraints defined on the columns
alter table MyTable
drop column Column1, Column2, ...
alter table MyTable
add column Column1 int null, Column2 varchar(max) null, ...
此外,如果更新一般较慢,则可能是过度索引的情况。看一下表中定义的索引,它们有多少,它们引用了哪些列等。通常,插入和更新在定义任何索引时都会变慢。但是,选择可以更快,所以不要只是进入并锁定所有索引,但尝试找到很少或从未使用的任何索引。
最后,如果数据库被正确编入索引并且仍然太慢,请查看TomTom的答案。
编辑:
要解决有关SQL Server表中列排序的注释,在大多数情况下,完全不重要,但是很少有必须维护它的场景:
ModifiedBy
和ModifiedOn
列不是表格中的最后两列,它会歪曲你的脑袋答案 2 :(得分:1)
另一种可能有用的方法是在运行更新之前禁用这些字段上使用的所有索引,然后再重建它们。这将消除一些I / O开销。
第二个选项是从表中选择所有数据到新表中,空值根据需要替换列。然后,截断第一个表,启用标识插入,并选择从新表返回到第一个表的所有内容。这也可以从索引的禁用中受益。
答案 3 :(得分:1)
没有WHERE的UPDATE尝试更新所有行,即使那些已经在列中已经为NULL的行也是如此。一个看似毫无意义的过滤器就像属于一个过滤器,可能会产生 BIG 影响。
UPDATE Table
SET
column1 = null,
column4 = null,
column8 = null,
column12 = null
WHERE
column1 IS NOT NULL OR
column4 IS NOT NULL OR
column8 IS NOT NULL OR
column12
或者,可能更好,取决于分布:
UPDATE Table SET column1 = NULL WHERE column1 IS NOT NULL
UPDATE Table SET column2 = NULL WHERE column2 IS NOT NULL
UPDATE Table SET column4 = NULL WHERE column4 IS NOT NULL
UPDATE Table SET column8 = NULL WHERE column8 IS NOT NULL
UPDATE Table SET column12 = NULL WHERE column12 IS NOT NULL
如果仍然需要太长时间,请尝试在任一解决方案上使用top(10000)并重复直到完成。
UPDATE top (10000) Table SET column1 = NULL WHERE column1 IS NOT NULL
etc...