Sql server SQL数据库中数千行的快速更新

Sql server SQL数据库中数千行的快速更新,sql-server,Sql Server,我想为所有19k行更新一列值,我想知道更新SQL数据库中数千行的最快方法。请建议 下面是我尝试过的代码,但执行起来花了整整一天的时间,这使得现有的应用程序冻结 update table_name set column_name_value = 2 如果您只是简单地将整个列更改为单个值,我会问,首先使用该列有什么意义。无论哪种方式,如果您要更新实时生产事务数据库,我都会先进行备份 如果允许,请将数据库切换到简单模式。这将减少传输日志使用的空间量,或者尝试大容量插入模式。这可能不是一个选项 也就

我想为所有19k行更新一列值,我想知道更新SQL数据库中数千行的最快方法。请建议

下面是我尝试过的代码,但执行起来花了整整一天的时间,这使得现有的应用程序冻结

update table_name 
set column_name_value = 2

如果您只是简单地将整个列更改为单个值,我会问,首先使用该列有什么意义。无论哪种方式,如果您要更新实时生产事务数据库,我都会先进行备份

如果允许,请将数据库切换到简单模式。这将减少传输日志使用的空间量,或者尝试大容量插入模式。这可能不是一个选项

也就是说,您可以删除该列,并使用默认值读取它

ALTER TABLE table_name DROP COLUMN column_name;
ALTER TABLE table_name ADD column_name INTEGER NOT NULL DEFAULT 2;
您也可以这样做:

UPDATE table_name WITH (TABLOCKX) SET column_name = 2;
如果您不能执行上述任何操作,使数据库停止运行,那么您可能必须将更新分块

尝试以下操作(如果表上碰巧有标识键):

DECLARE@num\u chunks INT=10——这将把您的更新分成10个较小的更新
声明@counter INT=0
而@counter<@num_块
开始
更新表名集合列名=2
其中(int_identity_column-@counter)%@num_chunks=0
在“+CAST”(getdate()作为VARCHAR)处打印“使用组完成”+CAST(@counter作为VARCHAR)+”
设置@counter=@counter+1
结束

使用此方法将允许您从停止的位置重新启动进程,如果您碰巧遇到问题并且进程被中断。

如果有问题,请删除索引,然后执行update语句。完成后,再次创建索引。在这里提问之前,你应该做一些基础研究,尤其是这样一个开放式问题。显示一行代码很难被认为是一项很好的工作。这是用于哪种RDBMS的?无论您使用的是MySQL、PostgreSQL、Oracle、SQL Server还是IBM DB2,甚至是其他什么,这通常都会产生影响。请在您的问题中添加相关标签!谢谢你的回复。我没有删除索引的任何权限@marc_的昨天-它是SQL Server的如果您不介意投票给我的答案,我将不胜感激!
DECLARE @num_chunks INT = 10 -- this will break your update into 10 smaller updates
DECLARE @counter INT = 0

WHILE @counter < @num_chunks
BEGIN
  UPDATE table_name SET column_name = 2 
  WHERE (int_identity_column - @counter) % @num_chunks = 0

  PRINT 'DONE WITH GROUP ' + CAST(@counter AS VARCHAR) + ' AT ' + CAST(getdate() as varchar)

  SET @counter = @counter + 1
END