数据库是oracle,用java程序查询1百万的数据库,如何加快分页跳转的速度?
每页两个查询:1.查询总页数: select count(proid) from sys.tblproduct2.查询指定页的记录集
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多秒!请问怎样才能加快大数据量的分页查询速度?
每页两个查询:1.查询总页数: select count(proid) from sys.tblproduct2.查询指定页的记录集
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多秒!请问怎样才能加快大数据量的分页查询速度?
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秒!!效率低了点吧!!如果用在网页查询,恐怕不太理想啊
无论索引再好,也会有比较严重的延时。解决方法每次新查询的第一页的时候进行select count(*),之后就把结果集总数通过上页下页的链接传递。以前,我就是那么干的,而且很爽。另外,要select top ,如果是oracle,那么好像是 rowid something?
就是浏览第10页的时候,让数据库只返回 第10页*30条/页=300条。也许有人说,可以通过嵌套的sql语句返回指定的那个30条,这种方法在少量记录的时候还行,
对于大量数据来说,DB捣腾不起。
上句将占99%的查询成本。
然后select top 10 * where ID >前面取出的ID即可
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
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
另外一个关键是要合理的索引设置
硬件的配置也要跟上
数据库的索引也很关键呀
----啰嗦了,别烦我,呵呵
hibernate不用的主要原因,我猜测是解析起来有点麻烦,必须在查询语句中间插一句,容易错。问题的另一个关键是,有必要在任何条件下给客户看全部数据么?客户关心么?
和客户交流,看他们能接受什么样的默认的查询条件限制,这来得实际多了。