游标和循环效率比较

tjfrog 2011-11-18 12:42:38
都说循环效率比游标高,尤其是大数据量的时候,可为啥我做的测试结果是游标效率很高, 请高人指点.以下是我做测试的语句

SQL Server 2005

/*游标语句*/

--32万条数据用了14秒
DECLARE @EMPLOYEE VARCHAR(10)
declare @begin varchar(30)
declare @end varchar(30)
declare @cnt int
set @cnt=1
set @begin=convert(varchar(23),getdate(),121)
print @begin
DECLARE CURSOR_AUTO_ALL CURSOR FOR
select em_no from users
OPEN CURSOR_AUTO_ALL

FETCH NEXT FROM CURSOR_AUTO_ALL INTO @EMPLOYEE
WHILE @@FETCH_STATUS=0
BEGIN
set @cnt=@cnt+1
FETCH NEXT FROM CURSOR_AUTO_ALL INTO @EMPLOYEE
END
set @end=convert(varchar(23),getdate(),121)

print @end
print @cnt

CLOSE CURSOR_AUTO_ALL
DEALLOCATE CURSOR_AUTO_ALL

/*循环*/
--32万条数据用了....过了9分钟还没运行完....
declare @employee varchar(30)
declare @begin varchar(30)
declare @end varchar(30)
declare @cnt int
set @cnt=1
set @begin=convert(varchar(23),getdate(),121)
print @begin

select identity(int,1,1) as id,em_no into #us from users

set @cnt=@@rowcount
while @cnt>0
begin
select top 1 @employee=em_no from #us where id=@cnt
set @cnt=@cnt-1
end
drop table #us
set @end=convert(varchar(23),getdate(),121)

print @end
...全文
1594 15 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
百通 2013-05-16
  • 打赏
  • 举报
回复
你循环用得有问题.32万条循环大概10秒以下.性能差别是因为以下几种情况 1: 你循环的时候的结果表更新了32万次索引,这个是最大开销.若你也只是print出来绝对缩小到3分钟内 2:你的ID是不是主键,或者是否有索引.如果是复合主键可以一次性查询出来到临时表里,设置一个自增长ID然后循环,这样一循环一次的i/o开销是扫描1-2次,做这个后你能把32万条的循环控制到1分钟内 游标就是根据循环来的,最优的游标性能也只跟循环一样.
快溜 2011-11-18
  • 打赏
  • 举报
回复
循环效率不高,游标跟循环不要比较了
tjfrog 2011-11-18
  • 打赏
  • 举报
回复
您说的我赞同, 有时候用定点处理比循环要节省大量资源. 我现在也想尝试改改机制, 从一次批量处理改成
即时处理[Quote=引用 5 楼 haiwer 的回复:]

游标没干任何事
循环产生临时表就很多I/O

这比较有何意义

一般来说,游标必然循环,游标不适于循环比较性能,而是与SQL语句处理比较性能,关键在处理本身
[/Quote]
tjfrog 2011-11-18
  • 打赏
  • 举报
回复 1
我要做的是
1 获取部门员工清单
2 对每个员工的每一天进行分析处理:取出排班数据和打卡数据进行分析, 得出迟到早退等信息

所以我现在用的是游标嵌套游标. 存储过程已经写好并使用了几年,我现在倒不急于优化, 我只是想知道道理, 并通过自己测试得出结论, 而不是人云亦云. 很多人都说宁用循环也不用游标, 说游标耗资源. 但我测试的结果是不处理任何业务,游标比循环快太多了, 请大家指点,谢谢
tjfrog 2011-11-18
  • 打赏
  • 举报
回复
请问为啥删呢?
[Quote=引用 10 楼 geniuswjt 的回复:]

我打了6排字,犹豫了下,还是都删了引用 9 楼 tjfrog 的回复:
引用 3 楼 timzhufaith 的回复:

就是有差距,也不会有这么大的差距。。。
代码优化下

请问该怎么优化呢? 我曾经测试过,这种循环相对来说已经是效率高的一种循环了
[/Quote]
geniuswjt 2011-11-18
  • 打赏
  • 举报
回复
我打了6排字,犹豫了下,还是都删了[Quote=引用 9 楼 tjfrog 的回复:]
引用 3 楼 timzhufaith 的回复:

就是有差距,也不会有这么大的差距。。。
代码优化下

请问该怎么优化呢? 我曾经测试过,这种循环相对来说已经是效率高的一种循环了
[/Quote]
tjfrog 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 timzhufaith 的回复:]

就是有差距,也不会有这么大的差距。。。
代码优化下
[/Quote]
请问该怎么优化呢? 我曾经测试过,这种循环相对来说已经是效率高的一种循环了
tjfrog 2011-11-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bbbbbben 的回复:]

一个是读取32W次 1条记录 (游标)
一个是读取32W次 32W条记录 (循环)

当然慢


循环的好处是一次性读32W条记录
[/Quote]

可循环的语句用的是select top 1 @employee=em_no from #us where id=@cnt 我理解的是32万循环, 每次1条, 而不是每次32万条?
q465897859 2011-11-18
  • 打赏
  • 举报
回复
区别不是很大
游标是对行集进行逐行遍历操作,循环则是重复某一组操作
游标占用的资源比较多
尽量用循环
--小F-- 2011-11-18
  • 打赏
  • 举报
回复
你插入个100W数据试试?

游标和循环的效率都不高。
昵称被占用了 2011-11-18
  • 打赏
  • 举报
回复
游标没干任何事
循环产生临时表就很多I/O

这比较有何意义

一般来说,游标必然循环,游标不适于循环比较性能,而是与SQL语句处理比较性能,关键在处理本身
rfq 2011-11-18
  • 打赏
  • 举报
回复
我在用的时候 如果游标超过 几千 就有问题了
用户的环境 工作负载很大 , 这种肯定不行.

TimZhuFaith 2011-11-18
  • 打赏
  • 举报
回复
就是有差距,也不会有这么大的差距。。。
代码优化下
jyh070207 2011-11-18
  • 打赏
  • 举报
回复
数据量不大的话,游标的效率还是可以接受的
我腫了 2011-11-18
  • 打赏
  • 举报
回复
一个是读取32W次 1条记录 (游标)
一个是读取32W次 32W条记录 (循环)

当然慢


循环的好处是一次性读32W条记录

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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