游标为什么效率低?

wzp144650 2011-12-28 01:07:18
如题,常听人这么说,但是不明白为什么
...全文
545 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
你有一篇文章,你是一个字一个字看的快,还是一行一行的看得快...
tqxiaofang 2011-12-29
  • 打赏
  • 举报
回复
我们知道关系数据库管理系统实质是面向集合的,在MS SQL SERVER 中并没有一种描述表中单一记录的表达形式,除非使用where 子句来限制只有一条记录被选中。因此我们必须借助于游标来进行面向单条记录的数据处理。由此可见,游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;它还提供对基于游标位置而对表中数据进行删除或更新的能力;而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。
yy1987316 2011-12-28
  • 打赏
  • 举报
回复
每次循环看成是一个select
  • 打赏
  • 举报
回复
游标就好比从一堆没有名字的书里找一本你要的书,你得一本一本的看,不能同时将这一堆书看完。希望这样解释你能明白(举这个例不是说找到需要的那本就停了,又表示需要一行一行的把这个数据集读完)
dovei 2011-12-28
  • 打赏
  • 举报
回复
游标是一条一条的扫描
一条条的扫.能快吗
sz_vcp2007 2011-12-28
  • 打赏
  • 举报
回复
有时间看看《SQL 性能调优》这本书有说明
wzp144650 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 chengang521 的回复:]

慢是肯定的,没有任何算法
[/Quote]

谢谢你的回答,但是我不知道你在说什么。希望可以更详细一些
wzp144650 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qianjin036a 的回复:]

游标效率低的原因,是由于读写过多.

我们知道,游标是按行处理的,把查出来的结果集中的每一行的值,写到某几个变量里去,再读取该变量的值,再进行比较处理.
一般说来,读写内存变量值是比较花时间的,因此,游标执行的效率由此而降低.
[/Quote]
恩,我觉得你的有一些道理,确实多了赋值、读取的操作,仅仅是这些吗?
Gabe 2011-12-28
  • 打赏
  • 举报
回复
慢是肯定的,没有任何算法
wzp144650 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 dielianhua_chenlong 的回复:]

不管是Oracle还是MSSQL。。游标都是逐行遍历。。慢是肯定的。。
[/Quote]
逐行遍历为什么就慢了?
我看很多人都提到这点,希望可以答出逐行会慢得原因
黄_瓜 2011-12-28
  • 打赏
  • 举报
回复
谁说游标一定慢?

既然存在就有它存在的道理。
koumingjie 2011-12-28
  • 打赏
  • 举报
回复
游标循环,每次相当于一个select操作
wzp144650 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 haiwer 的回复:]

单行循环处理当然不如集合操作效率高
[/Quote]
我觉得你的这个解释不是本质问题,从哪得知逐条处理一定比批量处理慢?
-晴天 2011-12-28
  • 打赏
  • 举报
回复
游标效率低的原因,是由于读写过多.

我们知道,游标是按行处理的,把查出来的结果集中的每一行的值,写到某几个变量里去,再读取该变量的值,再进行比较处理.
一般说来,读写内存变量值是比较花时间的,因此,游标执行的效率由此而降低.
mycodeis0000 2011-12-28
  • 打赏
  • 举报
回复
游标OPEN CLOSE 应该只有一次吧~

原因还是逐行执行~
Gabe 2011-12-28
  • 打赏
  • 举报
回复
因为没有任何算法在里面
jmx123456789 2011-12-28
  • 打赏
  • 举报
回复

declare @id int
declare mycursor cursor for select * from tb
open mycursor
fetch next from mycursor into @id

while(@@FETCH_STATUS=0)
begin
if(@id > 60)
begin
print @id
end
fetch next from mycursor into @id
end

close mycursor
deallocate mycursor

--逐行遍历
--不过有时候定位挺好用
「已注销」 2011-12-28
  • 打赏
  • 举报
回复
因为他每一次执行都要开启关闭一次。
  • 打赏
  • 举报
回复
不管是Oracle还是MSSQL。。游标都是逐行遍历。。慢是肯定的。。
  • 打赏
  • 举报
回复
无论是Oracle还是MSSQL 。。游标都是逐行遍历。。慢是肯定的。。。
加载更多回复(4)

34,594

社区成员

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

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