--1:无ORDER BY排序的写法。(效率最高)

--(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!)

SELECT *

FROM (SELECT ROWNUM AS rowno,
t.*

FROM emp
t

WHERE hire_date BETWEEN TO_DATE ('20060501',
'yyyymmdd')

AND TO_DATE ('20060731',
'yyyymmdd')

)
table_alias

;

--2:有ORDER BY排序的写法。(效率最高)

--(经过测试,此方法随着查询范围的扩大,速度也会越来越慢哦!)

SELECT *

FROM (SELECT tt.*, ROWNUM AS rowno

FROM (  SELECT t.*

FROM emp
t

WHERE hire_date BETWEEN TO_DATE ('20060501',
'yyyymmdd')

AND TO_DATE ('20060731',
'yyyymmdd')

ORDER BY create_time DESC, emp_no)
tt

)
table_alias

;

=================================================================================

=======================垃圾但又似乎很常用的分页写法==========================

=================================================================================

--3:无ORDER BY排序的写法。(建议使用方法1代替)

--(此方法随着查询数据量的扩张,速度会越来越慢哦!)

SELECT *

FROM (SELECT ROWNUM AS rowno,
t.*

FROM k_task t

WHERE flight_date BETWEEN TO_DATE ('20060501',
'yyyymmdd')

AND TO_DATE ('20060731',
'yyyymmdd')) table_alias

;

--TABLE_ALIAS.ROWNO 
between 10 and 100;

--4:有ORDER BY排序的写法.(建议使用方法2代替)

--(此方法随着查询范围的扩大,速度会越来越慢哦!)

SELECT *

FROM (SELECT tt.*, ROWNUM AS rowno

FROM (  SELECT
*

FROM k_task t

WHERE flight_date BETWEEN TO_DATE ('20060501',
'yyyymmdd')

AND TO_DATE ('20060531',
'yyyymmdd')

ORDER BY fact_up_time,
flight_no)
tt) table_alias

;

--5另类语法。(有ORDER BY写法)

--(语法风格与传统的SQL语法不同,不方便阅读与理解,为规范与统一标准,不推荐使用。)

WITH partdata AS

(

SELECT ROWNUM AS rowno,
tt.*

FROM (  SELECT
*

FROM k_task t

WHERE flight_date BETWEEN TO_DATE ('20060501',
'yyyymmdd')

AND TO_DATE ('20060531',
'yyyymmdd')

ORDER BY fact_up_time,
flight_no) tt

)

SELECT *

FROM partdata

;

--6另类语法 。(无ORDER BY写法)

WITH partdata AS

(

SELECT ROWNUM AS rowno,
t.*

FROM k_task t

WHERE flight_date BETWEEN TO_DATE ('20060501',
'yyyymmdd')

AND TO_DATE ('20060531',
'yyyymmdd')

)

SELECT *

FROM partdata

;

yangtingkun分析:

--- from
http://yangtingkun.itpub.net/post/468/100278

Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用。

分页查询格式:

SELECT *

FROM (SELECT a.*, ROWNUM rn

FROM (SELECT *

FROM table_name)
a

)

其中最内层的查询SELECT * FROM TABLE_NAME表示不进行翻页的原始查询语句。ROWNUM
<= 40和RN >= 21控制分页查询的每页的范围。

上面给出的这个分页查询语句,在大多数情况拥有较高的效率。分页的目的就是控制输出结果集大小,将结果尽快的返回。在上面的分页查询语句中,这种考虑主要体现在WHERE
ROWNUM <= 40这句上。

选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <=
40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <=
40语句,在查询的最外层控制分页的最小值和最大值。这是,查询语句如下:

SELECT *

FROM (SELECT a.*, ROWNUM rn

FROM (SELECT *

FROM table_name)
a)

对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。

这是由于CBO优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE
ROWNUM <=
40就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。

而第二个查询语句,由于查询条件BETWEEN 21 AND
40是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层(即使推到最内层也没有意义,因为最内层查询不知道RN代表什么)。因此,对
于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率
要比第一个查询低得多。

上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。

这里就不对包含排序的查询进行说明了,下一篇文章会通过例子来详细说明。

下面简单讨论一下多表联合的情况。

对于最常见的等值表连接查询,CBO一般可能会采用两种连接方式NESTED LOOP和HASH JOIN(MERGE
JOIN效率比HASH JOIN效率低,一般CBO不会考虑)。在这里,由于使用了分页,因此指定了一个返回的最大记录数,NESTED
LOOP在返回记录数超过最大值时可以马上停止并将结果返回给中间层,而HASH JOIN必须处理完所有结果集(MERGE
JOIN也是)。那么在大部分的情况下,对于分页查询选择NESTED
LOOP作为查询的连接方法具有较高的效率(分页查询的时候绝大部分的情况是查询前几页的数据,越靠后面的页数访问几率越小)。

因此,如果不介意在系统中使用HINT的话,可以将分页的查询语句改写为:

SELECT *

FROM (SELECT a.*, ROWNUM rn

FROM (SELECT *

FROM table_name) a

)

此文转载自 http://blog.sina.com.cn/s/blog_8604ca230100vro9.html  谢谢作者。

最新文章

  1. mysql 命令管理
  2. WPF+WEB+WinForm-&gt;&gt;表现层共用类
  3. Windows无法启动SQL server 代理服务(服务器)错误1067:进程意外终止
  4. JavaScript语言基础-环境搭建
  5. ASP.NET MVC 学习4、Controller中添加SearchIndex页面,实现简单的查询功能
  6. java this 隐式参数
  7. uploadify的使用
  8. Node.js:服务器与数据流
  9. python--DenyHttp项目(2)--ACM监考客户端1.0版
  10. MySQL最基本的概念梳理
  11. ie6常见的兼容性问题
  12. djongo:Django和MongoDB连接器
  13. shell脚本--编写CGI代码(shell结合html)以及环境变量
  14. Windows安装VNC服务端
  15. rmq区间最值
  16. Python 练习:使用 # 号输出长方形
  17. boto3--通过Python的SDK连接aws
  18. 20155232《网络对抗》Exp8 Web基础
  19. oo第八次作业--5,6,7次作业总结
  20. hdu 2251 Dungeon Master bfs

热门文章

  1. 《Django By Example》第一章 中文 翻译 (个人学习,渣翻)
  2. C# 生成验证码图片时消除锯齿
  3. 将DataTable中的某列转换成数组或者List
  4. iOS从零开始学习直播之2.采集
  5. Oozie分布式任务的工作流——Spark篇
  6. 学习笔记:URL Protocol在浏览器中打开本地应用程序
  7. 【腾讯优测干货分享】Android内存泄漏的简单检查与分析方法
  8. 匹夫细说C#:不是“栈类型”的值类型,从生命周期聊存储位置
  9. webpack搭建前端一条龙服务
  10. STM32的入侵检测是干什么用的