游标update表1700W行数据耗时4个小时还在执行

wingedFish-李先生 2012-07-09 04:13:56
CREATE PROCEDURE proc_update AS
begin
declare cur_update cursor dynamic for select * from customer_cmb
open cur_update
fetch first from cur_update

while @@fetch_status=0
begin

update customer_cmb set age = (case
when substring(id,7,4)like '%[a-zA-Z]%' then '0'
when len(id)=18 then year(getdate())-substring(id,7,4)
when len(id)=15 then year(getdate())-('19'+substring(id,7,2))
else '0'

end ) where current of cur_update
fetch next from cur_update
end
close cur_update
deallocate cur_update
end

存储过程中使用了游标,数据库是 sql2000, win7系统,问题RT。。。
望各位达人们帮帮忙...
...全文
178 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
發糞塗牆 2012-07-10
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

sql2000 发布游标的功能不是为了 提升数据量大的时候处理效率吗??
[/Quote]我很想知道哪个地方提了这句,拉出去枪毙,用游标不跑死服务器算万幸了,你还嫌慢
haitao 2012-07-09
  • 打赏
  • 举报
回复
直接执行不行吗:
update customer_cmb set age = (case
when substring(id,7,4)like '%[a-zA-Z]%' then '0'
when len(id)=18 then year(getdate())-substring(id,7,4)
when len(id)=15 then year(getdate())-('19'+substring(id,7,2))
else '0'
end )
筱筱澄 2012-07-09
  • 打赏
  • 举报
回复
估计的4天能跑完。 直接update
qiqi1983731 2012-07-09
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20111228/13/67b87ef2-e0ff-4876-b645-513fc5b2b864.html
中国风 2012-07-09
  • 打赏
  • 举报
回复
是身份证转换么?


旧的身份证号吗(15位)如何转换为新的(18位)
http://blog.csdn.net/roy_88/article/details/3898876

qiqi1983731 2012-07-09
  • 打赏
  • 举报
回复
直接用update 效率会高很多。
游标会扫描每一行,然后一行一行处理,肯定不如集中处理速度快。
中国风 2012-07-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

直接udate就行.
[/Quote]
Up+
Felixzhaowenzhong 2012-07-09
  • 打赏
  • 举报
回复
更新这么大的数据量 数据会锁表的
即便不用游标也会花费大量的时间。切忌在生产环境中执行。

分批次执行更新吧
  • 打赏
  • 举报
回复
sql2000 发布游标的功能不是为了 提升数据量大的时候处理效率吗??
xuam 2012-07-09
  • 打赏
  • 举报
回复
直接udate就行.
shoppo0505 2012-07-09
  • 打赏
  • 举报
回复
为啥用游标?
你直接运行update就行了啊。

getdate()也可以先存入一个变量中。

22,209

社区成员

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

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