SELECT * FROM 
    (
      SELECT A.*, ROWNUM RN 
      FROM (SELECT * FROM TABLE_NAME) A 
      WHERE ROWNUM <= 40
    )
      WHERE RN >= 21
   像这种分页是最常见的 取数据量小的时候 分页效率还是相当高的
  但是当 WHERE ROWNUM <= 40
到了100w 以上效率逐渐降低 而且是数据量越大效率越低..我希望谁能拿出解决方案来

解决方案 »

  1.   

    分页一般用到两种办法: 
    1,利用rownum 
    2,分析函数row_number()over() 1.
    select from( 
      select t.*,rownum rn from( 
        select * from a 
        order by col1)t 
      where rn between 101 and 200) 
    2. 
      select * 
      from(select t.*,row_number()over(order by col1)rn 
        from t) 
      where rn between 101 and 200 
     
    row_number()和ROWNUM是看起来相似但概念完全不同的东西,   
    row_number()是一个分析函数(Analytic   Function),它返回的是基于over()参数的行号。   rownum是oracle特别提供的一个伪列,它只作用于查询的结果集,根据结果集输出的先后次序给每个纪录顺次编号。  row_number() 要比rownum 高很多. 对一大表测试时, row_number() 用时6s,rownum 用时 17s. 
    ------------------------------------------------------------------------------
    Blog: http://blog.csdn.net/tianlesoftware
    网上资源: http://tianlesoftware.download.csdn.net
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
    Q Q 群:62697716
      

  2.   

    SELECT * FROM TABLE_NAME后面应该有order by吧
    数据量越大效率越低,这是肯定的
    试试
     SELECT * FROM 
        (
          SELECT A.*, ROW_NUMBER()OVER(ORDER BY colname) RN 
          FROM TABLE_NAME A 
        )
          WHERE RN >= 21 AND RN<=40看看效率会不会高一点
    如果可以的话,考虑增加一个排序字段,这样的话能大大提高性能
      

  3.   


    狂浪  回来了啊.. ------------------------------------------------------------------------------
    Blog: http://blog.csdn.net/tianlesoftware
    网上资源: http://tianlesoftware.download.csdn.net
    相关视频:http://blog.csdn.net/tianlesoftware/archive/2009/11/27/4886500.aspx
    Q Q 群:62697716
      

  4.   

    用 ROW_NUMBER()  比rownum 效率要高。但是数据量太大的情况下也快不了的,大数据量就要考虑分区、建索引。
      

  5.   

    分页一般用到两种办法: 
    1,利用rownum 
    2,分析函数row_number()over()