如果是涉及几千万的记录,确实需要慎重考虑实现方案。 如果使用的是JDBC3.0,那么可以考虑使用scrolled result set,Oracle的ojdbc14.jar应该支持这种结果集, 它可以绝对定位。另外一种实现方式是,使用rownum的方案: 其分页sql的形式如下: select * from (select a.*, rownum r from (select * from t where x = :variable order by y ) a where rownum < :HigerBound ) where r > :LowerBound
回3楼 第二个方法我已经试过了 order by后面的是一个主键 比如我的表是tb_test 表中主键为fd_id 我插入了5000000条数据 select * from (select a.*, rownum r from (select * from tb_test order by fd_id ) a where rownum <= 2000) where r > 1990 耗时0.078秒select * from (select a.*, rownum r from (select * from tb_test order by fd_id ) a where rownum <= 2000000) where r > 1999990 耗时11.203秒select * from (select a.*, rownum r from (select * from tb_test order by fd_id ) a where rownum <= 5000000) where r > 4999990 耗时27.546秒
order by 会用上索引????
google 一下scrolled ResultSet一定有很多解决方案,记住要用ojdbc14.jar那个驱动,而不是classes12.jar/zip
如果使用的是JDBC3.0,那么可以考虑使用scrolled result set,Oracle的ojdbc14.jar应该支持这种结果集,
它可以绝对定位。另外一种实现方式是,使用rownum的方案:
其分页sql的形式如下:
select * from (select a.*, rownum r from (select * from t where x = :variable order by y ) a
where rownum < :HigerBound )
where r > :LowerBound
这个方法越到后面
每翻一页
耗费时间会越长
PLSQL Developer的分页方式就比较高效
每翻一页的时间比较平均
谢谢楼上
大家还有好方法
方法2里边,对order by后边的字段需要建索引。
方法2应该不会越来越慢的。
第二个方法我已经试过了
order by后面的是一个主键
比如我的表是tb_test
表中主键为fd_id
我插入了5000000条数据
select * from (select a.*, rownum r from (select * from tb_test order by fd_id ) a
where rownum <= 2000)
where r > 1990
耗时0.078秒select * from (select a.*, rownum r from (select * from tb_test order by fd_id ) a
where rownum <= 2000000)
where r > 1999990
耗时11.203秒select * from (select a.*, rownum r from (select * from tb_test order by fd_id ) a
where rownum <= 5000000)
where r > 4999990
耗时27.546秒
google 一下scrolled ResultSet一定有很多解决方案,记住要用ojdbc14.jar那个驱动,而不是classes12.jar/zip