oracle分页语句

求教,在oracle 10g中,下面两条语句有什么区别:
[code="java"]
--分页语句
select * from (select e.*,rownum rn from (select * from emp) e where rownum <=15) where rn >=5;

select * from (select e.* ,rownum rn from (select * from emp) e) where rn>=5 and rn<=15;

[/code]

[quote]那样嵌套,是为了把真正要查询的内容分离,这只是个示例可能不用嵌套,但复杂了的时候,嵌套的效果就出来了[/quote]
其实除了排序以外,其他大部分情况都可以通过优化语句结构直接加在里面的。
反过来说,如果排序,分页实际上对性能没有任何提高,只是展示多少而已。

[quote]select * from (select ROW_NUMBER() OVER(order by erin_id) rn,t.* from te_resource_info t)
where rn between 5 and 20;[/quote]
这种方式确实在性能上是最差的,甚至不如问题中第二种方式。

其实说白了,分页在性能上的意义在于查询记录数的减少,而真正能将次数进行减少了才会提升性能。问题中第二种方式是将全部结果都查询出来再过滤。而用分析函数的方式不仅将全部记录都查询出来,还要进行排序,自然是最慢的。应该使用第一种方式,但是需要考虑风险:
1.如果是服务器端翻页,越向后翻页速度越慢。当然,即便翻到最后一页,也只相当于第二种情况而已。
2.如果优化方式使用了FIRST_ROWS的话,可能造成执行计划的变化,造成翻到后面的页会有较大性能的降低,甚至不如第二种。
3.如果语句中有排序,事实上用哪种方式都一样。基本上别指望提高性能了。应该尽可能避免这种情况。

--分页语句

select * from (select e.*,rownum rn from (select * from emp) e where rownum <=15) where rn >=5;

这句应该更快一些,越在里层先控制选择的条数,检索速度越快。

但实际测试,差别不是很大。

[quote]但实际测试,差别不是很大。 [/quote]
那是因为数据量还不够。

另外,分页语句就没必要再套子查询了:
select * from (select e.*,rownum rn from emp e where rownum <=15) where rn >=5;

用orcale分页不这这么分,性能太差,用这个

select * from (select ROW_NUMBER() OVER(order by erin_id) rn,t.* from te_resource_info t)
where rn between 5 and 20; (前后均包含,从第几条到第几条,一共20-5+1=16条,一定要order by)

这两句没有什么区别,oracle会自动优化成相同的执行顺序去执行的。
不过分页用这种方法效率不高,至于应该用哪种,楼上的仁兄已经说的很清楚了。