我有sql,需要分页之后按照status排序,我写的比较标准的sql应该是:
select * from
(
     select id,c1,c2,c3,starts from tb  order by status 
)a where rownum<=10 and rownum>=1由于我的tb表有上百万记录,这样一来的话,查询速度非常慢,需要31秒,因为第一次就是百万级别的记录的order by排序啦,所以非常慢,但是如果不这样写的话,就是不是按照status排序的分页显示啦,页面的数据显示就比较混乱了!该如何解决这个问题呢?

解决方案 »

  1.   

    这样不行吧
    你第一页可以这么写
    可第二页怎么办
    where rownum>10 and rownum<=20是出不来结果的
    select * from 

        select id,c1,c2,c3,starts,row_number()over(order by status)rn from tb 
    )a where rn>=1 and rn<=10 
      

  2.   


    这个是可以的,跟你的row_number效果一样啊。
      

  3.   

     select /*+ FIRST_ROWS */ id,c1,c2,c3,starts from tb  where rownum< maxNum 
    order by status这样放在内联视图,尽可能返回前面列
    试试这样会不会好些
      

  4.   


    oracle 分页是不能直接写rownum>10之类的,应该是这样的
    select * from 

        select id,c1,c2,c3,starts,row_number()over(order by status)rn from tb 
    )a where rn>=10 and rn <=20 
      

  5.   

    先将 select id,c1,c2,c3,starts from tb order by status 排序后的结果存入一个表中,在分页的时候直接去排序之后的表中去取结果,是否可以呢