--6行被选择耗时0.032秒
select * from (
  select t1.*,rownum rn from (
    select * from emp order by sal desc
  ) t1 where rownum<=10
) where rn>=5;--6行被选择耗时0.062秒
select * from (
  select t1.*,rownum rn from (
    select * from emp order by sal desc
  ) t1
) where rn between 5 and 10;--6行被选择耗时0.015
select * from emp where rowid in (
  select rid from (
    select rownum rn,rid from(
     select rowid rid from emp order by sal desc
    )where rownum<=10
  )where rn >=5
) order by sal desc;--6行被选择耗时0.031秒
select * from emp where rowid in (
  select rid from (
    select rownum rn,rid from(
     select rowid rid from emp order by sal desc
    )
  )where rn between 5 and 10
) order by sal desc;--6行被选择耗时0.031秒
select * from (
  select t.*,row_number() over(order by sal desc) rn from emp t
)where rn between 5 and 10;

解决方案 »

  1.   

    三种方法综合比较:使用rowid的效率最高,为0.015
      

  2.   

    这几个有什么区别吗  你从本质上分析为什么rowid的效率最高,就算是同一条SQL语句 在执行多次的情况下所消耗的时间也是大不一样啊 这是为什么呢 这样判断是不是有点问题啊
      

  3.   

    本质我也不太清楚,所以让大家讨论一下。我感觉是因为orwid存储的是物理地址所以查询的快,并且那种方式里面几层就只需要查询rowid和rownum,所以效率要高。但是它不太灵活语句又稍麻烦了点,特别是多表查询的时候更是麻烦,所以用的不是很多。用的最多的应该是第一种,方便灵活,不管单表多表都一样用,不同的查询只需要改变最里层的语句就可以。效率也还说的过去。
      

  4.   

    --6行被选择耗时0.032秒
    select * from (
      select t1.*,rownum rn from (
        select * from emp order by sal desc
      ) t1 where rownum<=10
    ) where rn>=5;--6行被选择耗时0.062秒
    select * from (
      select t1.*,rownum rn from (
        select * from emp order by sal desc
      ) t1
    ) where rn between 5 and 10;
    如果是大数据量的话 第一种的优势很大