站内搜索: 请输入搜索关键词

当前页面: 开发资料首页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


↑返回目录
前一篇: 关于session关闭的问题,前辈进~~~~~~~~~~
后一篇: jsp如何调用另外一个jsp的查询结果页面?