数据库是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.   

    给你看一下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上最快的方式
      

  2.   

    发现执行:
    select count(proid) from sys.tblproduct;COUNT(PROID)
    ------------
         1000000需要3.7秒!!!
      

  3.   

    执行:
    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秒!!效率低了点吧!!如果用在网页查询,恐怕不太理想啊
      

  4.   

    你的proid是不是索引,如果是索引正排序和反排序的效率是一样快的
      

  5.   

    proid 索引优化, Oracle POOL SIZE 优化
      

  6.   

    其实最有本质改变的是变通的省去每次都select couunt(*), 对于百万千万级别的这个语句,
    无论索引再好,也会有比较严重的延时。解决方法每次新查询的第一页的时候进行select count(*),之后就把结果集总数通过上页下页的链接传递。以前,我就是那么干的,而且很爽。另外,要select top ,如果是oracle,那么好像是 rowid something? 
    就是浏览第10页的时候,让数据库只返回 第10页*30条/页=300条。也许有人说,可以通过嵌套的sql语句返回指定的那个30条,这种方法在少量记录的时候还行,
    对于大量数据来说,DB捣腾不起。
      

  7.   

    这个要看用哪个字段排序了,如果按照ID之类的,即是主键聚集索引,下面这个思想的分页很快,百万级别,分到后面100W条左右600毫秒,解决千万级别估计没啥问题。先取出第N条的ID,例如 select top 1000000 @ID = ID;
    上句将占99%的查询成本。
    然后select top 10 * where ID >前面取出的ID即可
      

  8.   

    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
      

  9.   

    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
      

  10.   

    数据预先分页存储,在表中加一个PAGE_NUM字段来表示某一行所在的页,直接根据PAGE_NUM查询即可
      

  11.   

    看看这个,http://www.cnblogs.com/bluesky521/archive/2005/08/13/214073.html要采用orcale的数据分区功能,分区后速度提升很明显。
    另外一个关键是要合理的索引设置
    硬件的配置也要跟上
      

  12.   

    一定要采用orcale的数据分区功能,我做过一个访问9000多万条记录的项目(每个分区大约100万条记录),查询速度还是挺快的,但联合查询涉及的表多了还是不行,呵呵
    数据库的索引也很关键呀
    ----啰嗦了,别烦我,呵呵
      

  13.   

    我是这样做的。只在第一页和最后一页用count
      

  14.   

    用分析函数row_number(order by XX)会比较快,比rownum的性能好一些
    hibernate不用的主要原因,我猜测是解析起来有点麻烦,必须在查询语句中间插一句,容易错。问题的另一个关键是,有必要在任何条件下给客户看全部数据么?客户关心么?
    和客户交流,看他们能接受什么样的默认的查询条件限制,这来得实际多了。