blog.TangGaowei.com

absolute方式并不是好的Oracle分页查询方式

作者 Neot 写于 2006-07-09 | 3,847 次浏览 | 分类 » 软件开发 |

对Oracle查询进行分页时,很我开发人员都使用absolute方式进行分页,在Google上搜的也大多是这种方法。代码如下:

int thepage=(currPage-1)*pageSize; ps = conn.prepareStatement(sqlquery, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY); rs = ps.executeQuery(); rs.absolute(thepage+1); long n = 0; while(n< pageSize && !rs.isAfterLast()){ rs.next(); n++; }

但是,这种方式并不是一个好的分页方式。它先要取出所有的符合条件的记录存入ResultSet对象,然后用absolute方法进行定位,来实现分页。当记录数较大(比如十万条)时,整体的查询速度将会变得很慢。很次要把大量的数据存入ResultSet对象中,也要消耗大量的内存。而且,上面的方法本身还存在问题:当记录数为0是会执行到”rs.next();”,从而产生异常。

真正有效的Oracle查询分页方式,应该是利用Oracle查询语句自带的关键字RowNum来实现。Hibernate的Oracle分页方式就是用RowNum实现的。参考代码如下:

public String createOraclePagingSql(String sql, int pageIndex, int pageSize){ int m = pageIndex * pageSize; int n = m + pageSize; return “select * from ( select row_.*, rownum rownum_ from ( ” + sql + ” ) row_ where rownum <= ” + n + “) where rownum_ > ” + m; }

用RowNum实现分页,每次取出来的记录数最多也只和pageSize一样多,占用内存少,查询速度也快很多,万级的数据分页查询瞬间就能完成。

[ 标签: oracle, 分页 ]
[ 固定链接:http://blog.tanggaowei.com/2006/07/absoluteoracle.html ]

发表评论


点击图片可以听验证码

订阅

 

手机访问

http://blog.tanggaowei.com/wap/

Google