用java程序查询1百万的数据库,如何加快分页跳转的速度?
一般有常用几种基本的方法可以借鉴:
第一:
hibernate中的oracle分页查询原代码:
StringBuffer pagingSelect = new
StringBuffer(100);
pagingSelect.append("select * from ( select
row_.*, rownum rownum_ from ( ");
pagingSelect.append(sql);
pagingSelect.append("
) row_ where rownum <= ?) where rownum_ > ?");
其实就是
select
* from ( select row_.*, rownum rownum_ from ( 你的查询语句 )
row_ where
rownum <= 结束行) where rownum_ > 开始行
第二:
这个要看
用哪个字段排序了,如果按照ID之类的,即是主键聚集索引,下面这个思想的分页很快,百万级别,分到后面100W条左右600毫秒,解决千万级别估计没啥
问题。
先取出第N条的ID,例如 select top 1000000 @ID = ID;
上句将占99%的查询成本。
然
后select top 10 * where ID >前面取出的ID即可
第三:
1.
总共只需要一个查询总页数: select count(proid) from sys.tblproduct,而不是每翻页就去查询一次
2.
SQL语句中只需要一次排序就可以了,不需要多次排序
select productname,proid,addtime,prodetail
from
(select productname,proid,addtime,prodetail, rownum as rid
from
(select productname,proid,addtime,prodetail from sys.tblproduct order
by proid)
where rownum <= &intPage * &intPageSize
)
where rid >= (&intPage-1) * &intPageSize+1
第四:
采用orcale的数据分区功能,分区后速度提升很明显。
另外一个关键是要合理的索引设置
硬件的配置也要跟上
第 五:
用分析函数row_number(order by XX)会比较快,比rownum的性能好一些
hibernate不用的
主要原因,我猜测是解析起来有点麻烦,必须在查询语句中间插一句,容易错。
问题的另一个关键是,有必要在任何条件下给客户看全部数据么?
客户关心么?
和客户交流,看他们能接受什么样的默认的查询条件限制,这来得实际多了。