2019独角兽企业重金招聘Python工程师标准>>>

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

分页查询格式

SELECT * FROM ( SELECT A.*, ROWNUM RN
FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21

其中最内层的查询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 ) WHERE RN BETWEEN 21 AND 40

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

这是由于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 /*+ FIRST_ROWS */ * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A WHERE ROWNUM <= 40 ) WHERE RN >= 21

转载于:https://my.oschina.net/u/1412027/blog/207557

Oracle之分页查询相关推荐

  1. Oracle中分页查询语句

    Oracle分页查询语句使我们最常用的语句之一,下面就为您介绍的Oracle分页查询语句的用法,如果您对此方面感兴趣的话,不妨一看. Oracle分页查询语句基本上可以按照本文给出的格式来进行套用. ...

  2. oracle查询实现分页,Oracle实现分页查询的SQL语法汇总

    本文实例汇总了Oracle实现分页查询的sql语法,整理给大家供大家参考之用,详情如下: 1.无ORDER BY排序的写法.(效率最高) 经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据 ...

  3. Oracle的分页查询

    为什么80%的码农都做不了架构师?>>>    因为Oracle不像MySQL一样有limit函数来实现分页查找,oracle要实现分页查询可使用关键字rownum来处理.使用row ...

  4. oracle spring 分页查询,SpringJDBC 调用oracle 通用存储过程分页

    我博客前面有写道SpringJDBC调用通用的Oracle存储过程,今天来讲一下通用的Java存储过程带分页的功能,其中里面还有动态查询的SQL拼接,好的,先上代码 1.Java代码 @Autowir ...

  5. oracle高效分页查询总结

    本文参考链接:http://blog.sina.com.cn/s/blog_8604ca230100vro9.html 探索查询语句: --分页参数:size = 20 page = 2 --没有or ...

  6. sql server与oracle的分页,详解SQLServer和Oracle的分页查询

    不管是DRP中的分页查询代码的实现还是面试题中看到的关于分页查询的考察,都给我一个提示:分页查询是重要的.当数据量大的时候是必须考虑的.之前一直没有花时间停下来好好总结这里.现在又将Oracle视频中 ...

  7. oracle数据库分页查询慢,Oracle数据库中分页查询中排序及效率问题

    原始未分页查询Sql代码如下: select ROWNUM rn, t.id ID, o.name YYB,u.name XM, t.MC from tZDYSX t,tuser u,lborgani ...

  8. oracle分页怎么查询,Oracle的分页查询

    因为Oracle不像MySQL一样有limit函数来实现分页查找,oracle要实现分页查询可使用关键字rownum来处理.使用rownum有以下几点需要注意: 1.ROWNUM存在使用规则,在单个子 ...

  9. 使用oracle数据库分页查询语句,各种数据库的分页查询语句

    各种数据库的分页查询语句 1.oracle数据库分页select * from (select a.*,rownum rc from 表名 where rownum=endrow) a where a ...

最新文章

  1. java 后台路线学习
  2. 【JavaEE WEB 开发】Tomcat 详解 Servlet 入门
  3. avue form提交变为不可编辑_教程42——富文本编辑器的原理(项目)
  4. SAP Spartacus cms页面请求的语言参数
  5. 设计时晶振的问题库(z)
  6. Vue项目中如何设置动态的TDK
  7. 不属于html5表单元素的是,HTML5 表单元素
  8. 后来,我学会了每做完一件事
  9. 蓝桥杯 ALGO-52 算法训练 排列问题
  10. python立体爱心_总算认识磨砂爱心美甲步骤
  11. 人脸验证(一)--Deepface
  12. Rails中select2 实现多选框的效果
  13. MYSQL客户端访问服务端
  14. 学习是一件很辛苦的事,全世界都一样!
  15. 我是太阳因为自信才会把你照亮—2015许小乖的IT之路
  16. GJCTF 官方WP PWN部分
  17. mysql capi函数详解_CAPI函数描述(A-F)
  18. 使用redis存储历史浏览记录
  19. 【免费赠送源码】Springboot剧本杀交流分享平台1p7vg计算机毕业设计-课程设计-期末作业-毕设程序代做
  20. cocos2dx在Android studio运行 以及在 Android 平台上使用 JavaScript 直接调用 Java 方法

热门文章

  1. mac os 命令行下载
  2. 设置USB无线网卡为监听模式大学霸IT达人
  3. iOS12系统应用发送普通邮实现发送
  4. Shellcode开发辅助工具shellnoob
  5. java接口测试工具_接口测试基础了解篇
  6. autosar架构详细介绍_【技术】基于AUTOSAR的电机驱动系统分析
  7. php 怎么写个定时自理器,教你编写更加稳定、可读性强的JavaScript代码的示例
  8. Linux下MySQL登录报错1045,linux下 root 登录 MySQL 报错的问题
  9. 科学家发现量子大脑传感器可以跟踪脑电波,这可能对发现脑疾病至关重要
  10. 学习java的一些笔记(3)