SQL-Server:设置某些选定列的所有行(值)= NULL

时间:2013-01-24 09:47:46

标签: sql sql-server tsql

我想将 SQL-Server 数据库中某些表(而非全部)的所有值设置为NULL 。问题是,该表有超过30.000.000行,并且更新所有列/行需要很长时间。 如何加快以后的更新声明?

Update Table
Set
column1 = null,
column4 = null,
column8 = null,
column12 = null

不可能放弃桌子!

4 个答案:

答案 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表中列排序的注释,在大多数情况下,完全不重要,但是很少有必须维护它的场景:

  • 某些架构比较工具确实认为订单很重要,可能会报告数据库结构的变化
  • DBA是一个主要的挑剔者(我是),如果ModifiedByModifiedOn列不是表格中的最后两列,它会歪曲你的脑袋

答案 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...