求教分页效率问题

我想查一个大表的数据,大概有10M条数据,取其中的25条。测试发现两种方法时间差别很大,想求问大神原因。
第一种
SELECT * FROM (SELECT t.*,row_number() OVER (ORDER BY t.id DESC) AS rn FROM td_test t) WHERE rn BETWEEN 9999975 AND 10000000
大概用时5分钟。
第二种
SELECT * FROM (SELECT t.* FROM td_test t ORDER BY t.id DESC) WHERE rownum BETWEEN 9999975 AND 10000000
大概耗时1分30秒

为什么差别如此之大?求原因!

over()根据上一次的结果来累加
比如
row_number(col)over(order by col)这句话就是按照排序结果
从起始到当前行对col的行号一个累加

而oracle本身会把查询出来的结果view里面就已经包含了rownum这个列
所以先排序在拿结果集中的rownum是没有问题的
你直接把要排序tab换为(select * from xxxx order xxxxx)就可以了

row_number() OVER (ORDER BY t.id DESC)
这句话有个累加的过程,在这里浪费了很多时间
而oracle本身就是由rownum属性的

我再推荐一种分页吧,这个效率更高些
[code="sql"]select * from (select *,rownum as rn from tab where rownum=COUNT_START[/code]