为什么不使用游标比使用游标要快?

funcreal 2006-03-13 09:27:09
我想知道的是当应用程序访问数据库时,使用游标和不使用游标时,数据库都做了什么,都耗费了哪些资源?

在java中,Statement st = conn.createStatement (ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);//结果集只能向前滚动,不能自由定位行。我理解的是不使用游标。
while (rs.next()) {
}
,每执行一次循环,虚拟机内存就增加一点。应该是访问了一次数据库。
-----------------------------------------------------------------------------
如果:Statement st = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);//结果集可以自由定位。假如设置fetchSize=100。
while (rs.next()) {
}
则第一次执行rs.netx(),虚拟机内存就消耗约100个行大小,从内存中遍历完这100行后,再从数据库取100行。

在以上两种情况下,似乎总是第一种效率高。请问这两种情况下,数据库都做了怎样的工作?第一种情况下,应用程序是如何从数据库中取数据的,游标又为何会慢?对于数据库来说,使用不使用游标对系统内存有何不同的影响?
...全文
347 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
humanity 2006-03-18
  • 打赏
  • 举报
回复
fetchSize 一次预抓取的尺寸。

不是一共只抓取。

rs.next() 是问 Driver 还有数据么?
如果还有就返回 true , 那么不敏感的滚动结果集可以考虑缓冲,并且预抓取你要的行数以减少网络通讯量。

第一种情况可能是每次都产生 Socket 通讯而不缓冲,所以 fetchSize 也就没有实际意义了。
funcreal 2006-03-16
  • 打赏
  • 举报
回复
那为什么fetchSize在第一种情况下没有作用呢?
如果都是用的游标,我觉得第一种情况下也可以利用fetchSize来提高效率。
ChenZhi_cz 2006-03-13
  • 打赏
  • 举报
回复
你的理解有误!
不管哪种方式,对数据库而言,都是用了游标,只是游标的类型不同
第一种情况下,游标只向后移动,数据库只关心游标的当前位置,处理的时候简单加1
第二种情况下,游标可以自由定位,所以数据库需要记录游标的当前位置,表中可以使用的记录的条数,根据游标移动的方向,计算应当检索的数据的位置,这样当然比第一种慢得多!

帮助文件里关于游标参数的说明写的很清楚

249

社区成员

发帖
与我相关
我的任务
社区描述
其他产品/厂家
社区管理员
  • 其他
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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