M. *_*. X 4 sql t-sql sql-server
我想将SQL-Server数据库中某些表(而不是全部)的所有值都设置为NULL.问题是,该表有超过30.000.000行,并且更新所有列/行需要很长时间.如何加快以后的更新声明?
Update Table
Set
column1 = null,
column4 = null,
column8 = null,
column12 = null
Run Code Online (Sandbox Code Playgroud)
放下桌子是不可能的!
小智 6
问题是,该表有超过30.000.000行,并且更新所有列/行需要很长时间.如何加快以下更新声明?
你买一个更快的服务器.
认真.
无法丢桌.必须在一个语句中更新3000万行.
这两方面都是不可改变的.没有太多可能的优化(你可以杀死那些字段上的任何索引然后重新创建它们).剩下的就是获得更好的硬件.
对不起,没有更好的答案.您可以尝试在循环中一次更新10000次 - 这会使事务和语句更快,但我怀疑它会使整个操作更快,这是您的问题所在.最后必须完成工作,如果需要更快地完成工作,那么您需要更多功能=更快的服务器.
如果列位于表的末尾,或者列的顺序不相关,我认为最快的方法是删除列并再次重新创建它们
-- 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, ...
Run Code Online (Sandbox Code Playgroud)
此外,如果更新通常较慢,则可能是过度索引的情况.看一下表中定义的索引,它们有多少,它们引用了哪些列等.通常,插入和更新在定义任何索引时都会变慢.但是,选择可以更快,所以不要只是进入并锁定所有索引,但尝试找到很少或从未使用过的任何索引.
最后,如果数据库被正确编入索引并且仍然太慢,请查看TomTom的答案.
编辑:
为了解决有关SQL Server表中列排序的注释,在大多数情况下,它完全不重要,但是很少有必须维护它的场景:
ModifiedBy和ModifiedOn列不是表中的最后两列,它会歪曲你的头