日期:2014-05-17  浏览次数:20504 次

游标和循环效率比较
都说循环效率比游标高,尤其是大数据量的时候,可为啥我做的测试结果是游标效率很高, 请高人指点.以下是我做测试的语句

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

------解决方案--------------------
一个是读取32W次 1条记录 (游标)
一个是读取32W次 32W条记录 (循环)

当然慢


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

------解决方案--------------------
数据量不大的话,游标的效率还是可以接受的
------解决方案--------------------
就是有差距,也不会有这么大的差距。。。
代码优化下
------解决方案--------------------
我在用的时候 如果游标超过 几千 就有问题了
用户的环境 工作负载很大 , 这种肯定不行.


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

这比较有何意义

一般来说,游标必然循环,游标不适于循环比较性能,而是与SQL语句处理比较性能,关键在处理本身
------解决方案--------------------
你插入个100W数据试试?

游标和循环的效率都不高。
------解决方案--------------------
区别不是很大
游标是对行集进行逐行遍历操作,循环则是重复某一组操作
游标占用的资源比较多
尽量用循环 

------解决方案--------------------
我打了6排字,犹豫了下,还是都删了
引用:
引用:

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

请问该怎么优化呢? 我曾经测试过,这种循环相对来说已经是效率高的一种循环了

------解决方案--------------------
循环效率不高,游标跟循环不要比较了