当前页面: 开发资料首页 → JSP 专题 → 用java程序查询1百万的数据库,如何加快分页跳转的速度?
用java程序查询1百万的数据库,如何加快分页跳转的速度?
摘要: 用java程序查询1百万的数据库,如何加快分页跳转的速度?
数据库是oracle,用java程序查询1百万的数据库,如何加快分页跳转的速度?
每页两个查询:
1.查询总页数: select count(proid) from sys.tblproduct
2.查询指定页的记录集
String query ="select productname,proid,addtime,prodetail from (select productname,proid,addtime,prodetail,rownum rn from sys.tblproduct where rownum<="+(intPage*intPageSize)+" order by proid desc) t where rn>="+ ((intPage-1)*intPageSize+1) +" order by t.proid desc ";
然后循环读取这个记录集.
现在这样分页有时候在不同的页面跳转的时候(跨度比较大)需要10多秒!
请问怎样才能加快大数据量的分页查询速度?
顶.
ding
up
给你看一下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_ > 开始行
这种方式就是oracle上最快的方式
发现执行:
select count(proid) from sys.tblproduct;
COUNT(PROID)
------------
1000000
需要3.7秒!!!
执行:
select productname,proid,ADDTIME,prodetail from (select productname,proid,ADDTIME,prodetail,rownum rn from sys.tblproduct where rownum<=800000 order by proid desc) t where rn>=799981 order by t.proid desc;
需要17.4秒!!
效率低了点吧!!如果用在网页查询,恐怕不太理想啊
发现越到后面的页数,速度越慢
你的proid是不是索引,如果是索引正排序和反排序的效率是一样快的
收藏
up
proid是主键
proid 索引优化, Oracle POOL SIZE 优化
学习
其实最有本质改变的是变通的省去每次都select couunt(*), 对于百万千万级别的这个语句,
无论索引再好,也会有比较严重的延时。
解决方法
每次新查询的第一页的时候进行select count(*),之后就把结果集总数通过上页下页的链接传递。
以前,我就是那么干的,而且很爽。
另外,要select top ,如果是oracle,那么好像是 rowid something?
就是浏览第10页的时候,让数据库只返回 第10页*30条/页=300条。
也许有人说,可以通过嵌套的sql语句返回指定的那个30条,这种方法在少量记录的时候还行,
对于大量数据来说,DB捣腾不起。
越到后面越慢这在任何数据库中都一样.
顶下
mark
mark
试试写分页的存储过程来查询....
这个要看用哪个字段排序了,如果按照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
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
顶,这种方法,我们一直都是用的这样的
推荐一个 web打印工具 http://qq6441.meibu.com
楼上的方法,估计中间删掉一些数据的话好像不行哦。
有个bt的想法,不知道可行不可行。
增加一个页码列,记当前记录属于第几页,查询的时候按照该列来选取。
更新页码列在用户翻页的时候进行,用过期方法或者其他判定方法。这个对于固定页面大小的应该比较有用,对于需要多列排序分页的,就要对每种方式排序建一个分页列了。
数据预先分页存储,在表中加一个PAGE_NUM字段来表示某一行所在的页,直接根据PAGE_NUM查询即可
学习
100W的数据,有必要吗?
有这么多吗?为什么不分开处理呢?
假如真的要这样分页的话就在服务器端采用存诸过程来算了。
看看这个,http://www.cnblogs.com/bluesky521/archive/2005/08/13/214073.html
要采用orcale的数据分区功能,分区后速度提升很明显。
另外一个关键是要合理的索引设置
硬件的配置也要跟上
一定要采用orcale的数据分区功能,我做过一个访问9000多万条记录的项目(每个分区大约100万条记录),查询速度还是挺快的,但联合查询涉及的表多了还是不行,呵呵
数据库的索引也很关键呀
----啰嗦了,别烦我,呵呵
噢,你也就100万的数据,分不分区应该影响不大,调整下索引吧
试试,http://www.finereport.com
收藏了!学习!
分页,我喜欢,mark~
ding
我是这样做的。只在第一页和最后一页用count
mark
用分析函数row_number(order by XX)会比较快,比rownum的性能好一些
hibernate不用的主要原因,我猜测是解析起来有点麻烦,必须在查询语句中间插一句,容易错。
问题的另一个关键是,有必要在任何条件下给客户看全部数据么?客户关心么?
和客户交流,看他们能接受什么样的默认的查询条件限制,这来得实际多了。
随便说说:
lz可否采用二分法,来判断一下是升序还是降序排列
hao