为什么不使用游标比使用游标要快?
我想知道的是当应用程序访问数据库时,使用游标和不使用游标时,数据库都做了什么,都耗费了哪些资源?
在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行。
在以上两种情况下,似乎总是第一种效率高。请问这两种情况下,数据库都做了怎样的工作?第一种情况下,应用程序是如何从数据库中取数据的,游标又为何会慢?对于数据库来说,使用不使用游标对系统内存有何不同的影响?
问题点数:50、回复次数:3Top
1 楼ChenZhi_cz(潜水艇)回复于 2006-03-13 15:40:35 得分 30
你的理解有误!
不管哪种方式,对数据库而言,都是用了游标,只是游标的类型不同
第一种情况下,游标只向后移动,数据库只关心游标的当前位置,处理的时候简单加1
第二种情况下,游标可以自由定位,所以数据库需要记录游标的当前位置,表中可以使用的记录的条数,根据游标移动的方向,计算应当检索的数据的位置,这样当然比第一种慢得多!
帮助文件里关于游标参数的说明写的很清楚Top
2 楼funcreal(为中华之崛起而编程)回复于 2006-03-16 08:30:53 得分 0
那为什么fetchSize在第一种情况下没有作用呢?
如果都是用的游标,我觉得第一种情况下也可以利用fetchSize来提高效率。Top
3 楼humanity(城市边缘的狼)回复于 2006-03-18 16:21:16 得分 20
fetchSize 一次预抓取的尺寸。
不是一共只抓取。
rs.next() 是问 Driver 还有数据么?
如果还有就返回 true , 那么不敏感的滚动结果集可以考虑缓冲,并且预抓取你要的行数以减少网络通讯量。
第一种情况可能是每次都产生 Socket 通讯而不缓冲,所以 fetchSize 也就没有实际意义了。Top




