更正
第二句应该是
select * from (select *,rownum r_id from table1 order by code) where r_id >=10000 and r_id<=50000

解决方案 »

  1.   

    你的第二句比第一句负担更重.两句sql语句都要全表扫描.效率只有第一句稍好一点.
    但不是理想的.如果r_id是索引,并且第一句中能用索引则性能好一点.
    否则则能从别的方面考虑了。如缓存表等(但可能不好)
      

  2.   

    select * from table_name where rownum > 1000 and rownum  <= 1100
    用这样的语句,一次性的查出来吧,至于后面的分页相对量,自己另外用变量来控制它吧。。
      

  3.   

    sflight(飞);
    为什么第一句没有结果!怎么可能;就效率而言,肯定是第一句好!因为第一句最多只需要全盘扫描一次;
      

  4.   

    只是from打错了!我觉得既然是要根据rownum来进行选择,那么select *,rownum r_id from table1 order by code中的order by code 就可以不用了!筛选时进行了一次全部扫描再进行rownum的筛选实在不可取,不如这样,select * from table1 where rownum >=10000 and rownum<=50000 order by code;如果你有数据可以试一下!
      

  5.   

    set timing on ;然后进行查询!
      

  6.   

    如果用如下方法实现分页,对服务器的压力是否会很大
    我认为用ROWNUM分页没有用的,服务器必须选出所有的记录,才能生成rownum,
    rownum是虚拟的,不是客观的,服务器只有生成记录后,才有值,也就是所它会把所有的记录读取出来,我个人认为分页可以用ROWID
    最后select * from (select *,rownum r_id from table1 order by code) where rownum >=10000 and rownum<=50000是不返回结果的,我以前这么用就没有出结果,应该写成select * from (select *,rownum r_id from table1 order by code) where rownum <=10000 
    minus
    select * from  (select *,rownum r_id from table1 order by code) where
     rownum<=50000
      

  7.   

    select * from (select *,rownum r_id from table1 order by code) where r_id >=10000 and r_id<=50000没有什么排序效果!
    如果要达到排序效果,性能更不能保证
    不排序:
    select * from (select * from table1 order by code where rownum<=50000) where rownum>=10000;
      

  8.   

    select * from (select *,rownum r_id from table1 order by code) where r_id >=10000 and r_id<=50000没有什么排序效果!
    如果要达到排序效果,性能更不能保证
    不排序:
    select * from (select * from table1 order by code where rownum<=50000) where rownum>=10000;
      

  9.   

    排序本来就慢
    select * from (select a.*,row_number() over(order by code) rm from table1 a) where rm<=50000 where rm>=10000;
      

  10.   

    用RowNum根本就是一个陷阱,对初学者玩玩数千条的记录也可以,也可以达到效果。要真正用到大的表(10万记录以上),你就等着骂娘吧。
    这个问题困扰我半年了,一直没法解决。用SQL Server也没法解决(按非唯一索引列排序时)。
    难道真的没有人解决问题吗?No!看看oracle的SQLPlus,执行一个返回大量数据的SQL语句,不是一次返回所有记录吧!想想人家是怎么做的。
      

  11.   

    select * from (select A.*,rownum r from table A) where r>5000 and r<6000
    效率很好,可行,不需要加order by
      

  12.   

    即使你需要加Order by也可以,这种写法我个人认为是目前最好的方法,你可以看看他的执行计划。还算可以啦。
      

  13.   

    rownum 根本就是傻子干的,他本身就是一个虚拟的值,你可以随便建一个少数据量的表,然后用order by 某个字段,再看看rownum,此时rownum是动态的变化的,就是说不同的order by,会产生不同的结果,使用rowid还是好的,但是rowid的问题在于物理地址的重复使用,也同样会产生先后定位不正确