MSSQL 一次更新20W条数据时,提示超时

songjinxi123 2009-08-26 10:32:04
有这么多一个表,表名为table1,里面有字段a1,a2,a3,a4 还有一些其他字段。总数据量有50多万条

我需要一次性更新20W或20W以上的数据。


@a3 varchar(50),
@a1 varchar(50),
@a4 varchar(8000),
@b1 varchar(50),
@a2 datetime
as
update table1 set a1=@b1,a2=@a2 where a3=@a3 and a1=@a1 and a4=@a4


后来我在网上搜索了一下,有人说可能是因为更新的时候表有写入操作,于是就改了一下:

@a3 varchar(50),
@a1 varchar(50),
@a4 varchar(8000),
@b1 varchar(50),
@a2 datetime
as
update table1 WITH (ROWLOCK) set a1=@b1,a2=@a2 where a3=@a3 and a1=@a1 and a4=@a4

但是还是依旧超时,实际上我可以100%保证更新的时候没有写入操作。

就这么一句语句,执行了很久都没反应。我将CommandTimeout设为3600秒,结果等了一个小时之后还是超时了。请问这到底是硬件差了造成的,还是因为SQL语句没写好造成的?如何解决。
...全文
221 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiequan2 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 songjinxi123 的回复:]
引用 9 楼 xiequan2 的回复:
引用 8 楼 songjinxi123 的回复:
引用 3 楼 xiequan2 的回复:
SQL code
拆分为批处理setrowcount5000;while1=1beginupdate table1set  a1=@b1,a2=@a2where a3=@a3and a1=@a1and a4=@a4....if@@rowcount <5000break;end


但有时候我只需要更新1行,这样写似乎不行。
为什么说1行不行呢?


是我搞错了,抱歉。但是加了你这个代码进去之后,速度比不加更慢了。看来只能用索引。
[/Quote]解决就好
songjinxi123 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xiequan2 的回复:]
引用 8 楼 songjinxi123 的回复:
引用 3 楼 xiequan2 的回复:
SQL code
拆分为批处理setrowcount5000;while1=1beginupdate table1set  a1=@b1,a2=@a2where a3=@a3and a1=@a1and a4=@a4....if@@rowcount <5000break;end


但有时候我只需要更新1行,这样写似乎不行。
为什么说1行不行呢?
[/Quote]

是我搞错了,抱歉。但是加了你这个代码进去之后,速度比不加更慢了。看来只能用索引。
SQL77 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 songjinxi123 的回复:]
增加了索引果然有效,2分钟不到就完成了。只是还是觉得有点慢,还有其他的优化方法了吗?难道只能提升硬件了?
[/Quote]
呵呵,分批处理试试看,应该可以的
--小F-- 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 songjinxi123 的回复:]
增加了索引果然有效,2分钟不到就完成了。只是还是觉得有点慢,还有其他的优化方法了吗?难道只能提升硬件了?
[/Quote]

分批处理试一下
feixianxxx 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 songjinxi123 的回复:]
增加了索引果然有效,2分钟不到就完成了。只是还是觉得有点慢,还有其他的优化方法了吗?难道只能提升硬件了?
[/Quote]
分批处理

一条更新 就只花一条的时间 不是5000条的时间
songjinxi123 2009-08-26
  • 打赏
  • 举报
回复
增加了索引果然有效,2分钟不到就完成了。只是还是觉得有点慢,还有其他的优化方法了吗?难道只能提升硬件了?
lihan6415151528 2009-08-26
  • 打赏
  • 举报
回复
加上索引 试试
xiequan2 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 songjinxi123 的回复:]
引用 3 楼 xiequan2 的回复:
SQL code
拆分为批处理setrowcount5000;while1=1beginupdate table1set  a1=@b1,a2=@a2where a3=@a3and a1=@a1and a4=@a4....if@@rowcount <5000break;end


但有时候我只需要更新1行,这样写似乎不行。
[/Quote]为什么说1行不行呢?
songjinxi123 2009-08-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xiequan2 的回复:]
SQL code
拆分为批处理setrowcount5000;while1=1beginupdate table1set a1=@b1,a2=@a2where a3=@a3and a1=@a1and a4=@a4....if@@rowcount<5000break;end
[/Quote]

但有时候我只需要更新1行,这样写似乎不行。
--小F-- 2009-08-26
  • 打赏
  • 举报
回复
3楼的分批处理比较好
也可以考虑增加索引和升级硬件
feixianxxx 2009-08-26
  • 打赏
  • 举报
回复
--总结下
1.提示硬件
2. 加索引
3.分批量处理 (这个我上次看 紫陌红尘 转转这么处理过)
SQL77 2009-08-26
  • 打赏
  • 举报
回复
加索引应该是个好方法
dawugui 2009-08-26
  • 打赏
  • 举报
回复
加个主键或是索引就行了.
xiequan2 2009-08-26
  • 打赏
  • 举报
回复

拆分为批处理
set rowcount 5000;
while 1=1
begin
update table1 set a1=@b1,a2=@a2 where a3=@a3 and a1=@a1 and a4=@a4....
if @@rowcount<5000 break;
end
Yang_ 2009-08-26
  • 打赏
  • 举报
回复
这个改动没有任何作用,可以改回来

增加一个索引,(a1,a3,a4),选择这三个字段重复率最低的(也就是取值可能最多的)放在前面
SQL77 2009-08-26
  • 打赏
  • 举报
回复
加大内存,硬件是个原因,

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧