当前位置: 首页 > news >正文

Oracle分页查询语句(一)

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

 

 

  分页查询格式:

 

 

 

 

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

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

选择第21到40条记录存在两种方法,一种是上面例子中展示的在查询的第二层通过ROWNUM <= 40来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 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的话,可以将分页的查询语句改写为:

 

相关文章:

  • ORACLE分页查询语句_rownum(二)
  • Oracle的优化器
  • oracle的case函数控制结构DECODE()函数
  • JQuery入门简介
  • Js字符串操作函数大全
  • js 运算符 || 妙用
  • javascript获得url中的参数
  • 获取浏览器的高度和宽度
  • js省市级联
  • C#调用外部程序
  • oracle学习笔记(一)分享
  • 日期时间脚本库方法列表
  • JS 打开新窗口的方法
  • js日期加减得到新的日期
  • Oracle 10g DBMS_SCHEDULER的中度解析
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • jQuery(一)
  • JS基础之数据类型、对象、原型、原型链、继承
  • js作用域和this的理解
  • laravel with 查询列表限制条数
  • Lsb图片隐写
  • RxJS: 简单入门
  • Swift 中的尾递归和蹦床
  • vue-router的history模式发布配置
  • vue从入门到进阶:计算属性computed与侦听器watch(三)
  • 半理解系列--Promise的进化史
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 前端面试之CSS3新特性
  • 区块链将重新定义世界
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 移动端 h5开发相关内容总结(三)
  • shell使用lftp连接ftp和sftp,并可以指定私钥
  • 阿里云服务器如何修改远程端口?
  • #pragma 指令
  • ${ }的特别功能
  • %check_box% in rails :coditions={:has_many , :through}
  • (Matlab)遗传算法优化的BP神经网络实现回归预测
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (简单) HDU 2612 Find a way,BFS。
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (四)库存超卖案例实战——优化redis分布式锁
  • (转) Android中ViewStub组件使用
  • .gitignore文件—git忽略文件
  • .Net - 类的介绍
  • .net core webapi Startup 注入ConfigurePrimaryHttpMessageHandler
  • .NET Reactor简单使用教程
  • .NET 命令行参数包含应用程序路径吗?
  • .net 验证控件和javaScript的冲突问题
  • .NET4.0并行计算技术基础(1)
  • .考试倒计时43天!来提分啦!
  • @Not - Empty-Null-Blank
  • [AIGC] 开源流程引擎哪个好,如何选型?
  • [Angular] 笔记 8:list/detail 页面以及@Input