首页 > 开发 > 综合 > 正文

将一个更新划分为几个批次

2024-07-21 02:10:42
字体:
来源:转载
供稿:网友

问:我想以一次5,000行的方式批量更新一个大型表,但我不知道怎样分割数据。该表不包含增量数字或整数主键。怎样才能在保持良好性能的同时实现数据更新呢?

答:如果知道哪些行尚未被更新,您可以使用简单的谓词来排除已更新的行,rowcount设置可以帮助您批量分割数据。以下的代码清单说明了如何使用该设置:

set rowcount 1000
while (1=1) begin
   begin transaction
   update...set ...,mylastupdate='date',...where
     mylastupdate < 'date'
     -- 更新1000未更新行
   if @@rowcount = 0
   begin
    commit transaction
    break
   end
   commit transaction
end

在指定的行数返回后,rowcount将使sql server停止查询处理。这项技术很有用,因为它避免了大量更新所致的并发命中;更新中的行数越少,更新任务使其他用户不能访问该数据的可能性就越小。结合事务日志备份,这一方法还可以使您的事务日志的大小降至最低。

如果没有识别已更新行的机制,您可以使用游标遍历所有数据并提交每个x值。但是,游标占用服务器资源的时间通常要多于基于集合的语句。

—microsoft sql server开发团队

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表