传统的分页是这样的
select * from (select rownum rw, * from table_name order by key_column) where rw >= ? and rw < ?当表比较小时这样做还可以接受,但是表比较大时就有问题了select rownum rw, * from table_name order by key_column
这一语句运行比较缓慢并且消耗资源较多怎么优化好?

解决方案 »

  1.   

    写错了一点,应该是select * from (select rownum rw, * from table_name where and rownum < ?
    order by key_column) where rw >= ? 
      

  2.   

    把rownum写到子查询里面,使子查询不需要遍历整张表
    select * from (select rownum rw, * from table_name where rw < ? order by key_column) where rw >= ?
      

  3.   

    --分析函数(推荐)
    select *
    from (select a.*,row_number() over(order by key_column) rw
    from tb a)
    where rw >= ? and rw < ?select *
    from (select a.*,rownum rw from (select * from table_name order by key_column) a
    where rownum <m)
    where rw>=n
    --你的的这样
    select *
    from (select a.*,rownum rw from (select * from table_name order by key_column) a
    )
    where rw >= ? and rw < ?
      

  4.   

    不好意思,昨晚有些迷糊今天回去查了下,我想要的逻辑是这样的select * from 
    (
    select rownum rw, t.* from 
    (select * from table_name order by key_column) t 
    where rownum < ?
    )
    where rw > ?
      

  5.   

    我试了一下row_number 发现速度较慢大概要五分钟才能查出结果(4kw数据)=======
    select *
    from (select a.*,rownum rw from (select * from table_name order by key_column) a
    where rownum <m)
    where rw>=n
    =========
    这个写法比较快 但也要一分多钟 
      

  6.   

    Sql Server中有个select top N子句,oracle有对应的转换,你可以去百度一下转化关系,然后试试
      

  7.   

    ls是不是在说rownum?这里主要想讨论表比较大的情况怎么分页好
    起因是我的分页sql让dba杀了
      

  8.   

    这样的写法已经是最快的分页查询写法了。
    另外一种写法是between,显然没这个快。
    如果还需要追求速度,我觉得可能要考虑其它的方法了,单单的去优化分页查询语句,没什么可优化的了。
      

  9.   

    只能用rownum了,没有其他的好的了