oracle 分页_80分页查询,不止写法

    据孔老先生说,茴香豆的茴字有四种写法,那oracle的分页查询又有多少种写法呢?

分页查询,其实本质上就是topN查询的变种, 如果把topN的一部分结果集去掉,就变成了分页.

topN的基本写法,两层select,第一层先order by,第二层再用rownum:

select owner,object_name,object_id,rownum as rn from(select * from t1 where owner='SYS' order by object_id desc) where rownum<=20;

有些初级开发人员有时会写成:

select owner,object_name,object_id,rownum as rn from t1 where owner='SYS'  and rownum<=20 order by object_id desc;

这种写法的逻辑可能存在问题,因为sql解析时会先执行rownum,随机先选出20条记录,再执行排序. 而不是常见业务需要的先排序,再取前20. 如果满足条件的全部结果集<=20, 那么逻辑也是没问题的.

在上面topn的基础上, 再套一层select, 就变成了最常见的标准的三层select的分页查询写法(第一层排序,第二层给rownum取别名,得到topn,第三层去掉topn的前面部分):

select owner,object_name,object_id,rn from

  (select a.*,rownum as rn from

   (select * from t1 where owner='SYS' order by object_id desc) a where rownum<=20

  ) where rn>10;

执行计划中看到COUNT STOPKEY 为最佳(没有sort字样).

除了上面比较常见的写法, 还有其他几个不常见的写法:

1层select(12c+才支持的offset 写法,有时可能需要使用hint来纠正优化器执行计划):

select  owner,object_name,object_id,rownum as rn

from t1

where owner='SYS'

order by object_id desc

offset 10 rows fetch next 10 rows only;

执行计划中看到WINDOW NOSORT STOPKEY为最佳

2层select,用到了row_number分析函数(可能需要使用hint来纠正优化器执行计划):

SELECT * FROM

  (SELECT   owner,object_name,object_id,

            row_number() over (order by object_id desc) as rn

          FROM t1

        where owner='SYS'

)  WHERE RN<= 20 and RN > 10;

执行计划中看到WINDOW NOSORT STOPKEY为最佳

4层select,对于页数比较大的分页查询,某些情况下可以使用:

with tmp as

(SELECT * FROM

    ( SELECT rid, ROWNUM as RN

       FROM

           (SELECT rowid as rid

             FROM t1

             where owner='SYS'

             order by object_id desc

            ) WHERE ROWNUM <= 500

    ) WHERE RN > 490

) select  /*+ use_nl(a) leading(b) */ owner,object_name,object_id,rn

from t1 a,tmp b

where a.rowid=b.rid;

下面的3层写法,是比较常见的低效分页写法,在分页前结果集大的情况,性能会比较差, 需要避免使用:

select * from

(

select a.*,rownum as rn  

from

(select owner,object_name,object_id

  from t1

  where owner= 'SYS'

   order by object_id desc

)a

) where rn>10 and rn<=20;

执行计划一般包含  SORT ORDER BY 的步骤.

掌握了分页写法,只是优化的第一步,下面我们看一个生产案例,SQL代码如下:

de1e4c75351f95c9d98b9ae4e0d0be05.png

这是一个取topn的SQL,先取topn(分页前结果集20万左右),再left join,写法完全没问题,但是执行时间还是比较长,需要24秒:

4cb21877e444745c7d09355106167d8c.png

用hint调下执行计划,执行时间变成1秒:

hint:  /*+ monitor leading(p o) push_pred(co@sel$2) */

671ddff96a932d39533a557674748fe0.png

如果再创建一个core_userprofile表上orgid+UpdateDate+id 3字段联合索引, 那么这个SQL的执行时间估计也就是10毫秒以下了. (从24秒到10毫秒,这种性能的提高,靠硬件是无法实现的,现实中确实有很多类似的SQL,可惜的是,我们很多的决策人员, 只相信高级硬件才能解决性能问题,不知道有这些高级优化技巧)

总结:

    分页查询,写法只是第一步,写法正确的基础上,如果执行计划不佳,我们可以通过oracle优化器提供的hint来调整执行计划(不需要改sql代码); 但是如果sql写法不佳,也是没有办法通过调整索引和执行计划进行优化. 

    写法和索引,是SQL优化的核心,在此基础上通过hint调整执行计划, 是更高级的技术, 需要更进一步的了解优化器特性,以人脑优化器代替电脑优化器.

    想提高SQL优化技能,看完我的线上培训课程(索引专题,SQL写法与改写专题)会大有帮助.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/574961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

笔记:Hadoop权威指南 第1章 初识Hadoop

大数据处理遇到问题&#xff1a; (1)、磁盘存储容量快速增加&#xff0c;但是访问速度进步不大&#xff1b;用户乐意使用磁盘共享访问。 (2)、硬件故障&#xff0c;可以使用备份解决。 (3)、分布式系统&#xff0c;需要可靠性。 关系数据库与MapReduce比较&#xff1a; (1)、磁…

php switch if,php switch 与 if else 区别

在php中switch是选择&#xff0c;if else也有同理&#xff0c;但是它们肯定是有区别的&#xff0c;那么我们来看看它们两者的区别在哪里呢&#xff0c;下面先看switch case语句吧。switch($id){case 1:return asp/;break;case 2:return phper/;break;case 3:return jsp/;break;…

python读取mat数据是字典形式如何转化为矩阵_mat2json, python读取mat成字典, 保存json...

python程序, 实现matlab的.mat格式转化为dict / json .第一个参数mat_path代表需要转化的mat路径;第二个参数, 如果需要把字典序列化成json, 添加这一参数, 代表json存放位置;返回值: 转化好的字典import osimport jsonimport scipy.io as spioimport pandas as pddef loadmat(…

GitHub上创建组织

4.3. 组织和团队 GitHub 在早期没有专门为组织提供账号&#xff0c;很多企业用户或大型开源组织只好使用普通用户账号作为组织的共享账号来使用。后来&#xff0c;GitHub推出了组织这一新的账号管理模式&#xff0c;满足大型开发团队的需要。 组织账号是不能用来登录的&#xf…

jquery根据value值php,表单php传值后jquery清除表单某项value问题

表单php文件我现在写了一个jquery打算每次提交后清除姓名中的内容代码如下$(function() { $(:input,#recordform) .not(:button, :submit, :reset, :hidden) .val() })请问怎么使用啊 加在哪个都无法实现提交后清除姓名求助&#xff01;回复讨论(解决方案)不知道你的 js 函数 c…

python未将对象引用设置到对象的实例_在Python中使用pingarapi。服务器引发Webfault:对象引用未设置为对象的实例...

大家晚上好。我想说的是&#xff0c;我对wsdl、soap、suds这整件事都很陌生&#xff01;尽可能多地提供信息。wsdl是这个http://api3.pingar.com/PingarAPIService.asmx?WSDL我花了好几个小时试图找出我正在使用的代码有什么问题&#xff0c;但最终还是一无所获。我借用了这里…

php 网站上传大小限制吗,配置PHP程序网站上传文件大小的限制!

PHP程序做的网站&#xff0c;上传文件大小的限制&#xff0c;是在PHP的配置文件中设置的。WORDPRESS网站也是PHP程序&#xff0c;我们会在WordPress里面的很多地方遇到文件上传大小的限制&#xff0c;比如在媒体库里面&#xff0c;上传图片&#xff1b;恢复数据时&#xff0c;上…

python元组元素抓7_Python3基础 tuple 通过拆分元组向元组中加入新的元素

Python : 3.7.0OS : Ubuntu 18.04.1 LTSIDE : PyCharm 2018.2.4Conda : 4.5.11typesetting : Markdowncode"""Author : 行初心Date : 18-9-23Blog : www.cnblogs.com/xingchuxinGitee : gitee.com/zhichengjiu"""def main():new_members (阳明贪…

Hypothesis, 一个很少人会用的Python测试库

在软件开发中&#xff0c;测试是保证代码质量和功能正确性的重要环节。为了提高测试的覆盖率和效率&#xff0c;开发者们创造了许多测试框架和工具。其中 Hypothesis 是一个强大且受欢迎的 Python 测试库&#xff0c;它利用属性基测试的思想&#xff0c;可以自动生成测试数据并…

用户留存 数据统计 php,位运算实现用户留存率

统计留存率之前先弄清一下留存率的概念&#xff0c;百度百科中是这么说的&#xff1a; 用户在某段时间内开始使用应用&#xff0c;经过一段时间后&#xff0c;仍然继续使用应用的被认作是留存&#xff1b;这部分用户占当时新增用户的比例即是留存率&#xff0c;会按照每隔1单位…

php mcrypt取消,php – Mcrypt弃用后如何解密?

我已将我的php版本更新为7.1.我有使用mcrypt加密数据的功能.现在不推荐使用此功能.无论如何我都可以通过回到旧版本的php来解密数据.这是我使用的代码&#xff1a;public function encrypt($plaintext) {$ivSize mcrypt_get_iv_size(self::CIPHER, self::MODE);$iv mcrypt_cr…

线条边框简笔画图片大全_儿童简笔画画大全人物

由于简笔画有概括、形象、幽默、简练的特点,符合儿童生理、心理发展的需要,便于儿童接受与掌握。儿童简笔画画大全人物有哪些呢?下面由学习啦小编带来的儿童简笔画画大全人物&#xff0c;欢迎欣赏!儿童人物简笔画画图片大全欣赏儿童简笔画画人物图1&#xff1a;跳舞的小女孩简…

求两条轨迹间的hausdorff距离_题型 | 圆上有n个点到直线距离为d?

圆上有n个点到直线的距离为d圆 上到直线 的距离为 的点有&#xff08; &#xff09;个方法一&#xff1a;常规方法&#xff0c;画图分析由图象可以明显看出&#xff0c;圆在直线上方的部分内没有满足题意的点&#xff0c;在直线下方的部分内有两个满足题意的点。但是这样的方法…

java字符串包含连续数字,Java中包含数字的排序字符串

小编典典尝试使用此比较器&#xff0c;该比较器将删除所有非数字字符&#xff0c;然后将其余字符与数字进行比较&#xff1a;Collections.sort(strings, new Comparator() {public int compare(String o1, String o2) {return extractInt(o1) - extractInt(o2);}int extractInt…

MyEclipse的Debug模式

在MyEclipse中使用debug模式 1, 首先在一个java文件中设断点&#xff0c;然后运行&#xff0c;当程序走到断点处就会转到debug视图下&#xff0c; 2, F5键与F6键均为单步调试&#xff0c;F5是step into,也就是进入本行代码中执行&#xff0c;F6是step over&#xff0c; 也就是执…

redis setnx 分布式锁_Redis 分布式锁PHP

Redis 分布式锁的作用在单机环境下&#xff0c;有个秒杀商品的活动&#xff0c;在短时间内&#xff0c;服务器压力和流量会陡然上升。这个就会存在并发的问题。想要解决并发需要解决一下问题1、提高系统吞吐率也就是qps 每秒处理的请求书解决问题一&#xff1a;采用内存型数据库…

mysql备份至本地,mysql备份(本地+远程)

整体规划生产环境的mysql数据库&#xff0c;应当每日进行备份&#xff0c;并对较远之前的备份进行删除&#xff0c;由于担心mysql服务器本身崩溃&#xff0c;因此需要考虑将备份的文件同时保存到其他服务器&#xff0c;这样能提高数据安全。备份的方式使用mysqldump&#xff0c…

WinForm窗体自适应分辨率

我们自己编写程序的界面&#xff0c;会遇到各种屏幕分辨率&#xff0c;只有自适应才能显的美观。实际上&#xff0c;做到这点也很简单&#xff0c;就是首先记录窗体和它上面控件的初始位置和大小&#xff0c;当窗体改变比例时&#xff0c;其控件的位置和大小也按此比例变化即可…

ping端口_干货分享:shell脚本批量telnet ip 端口

问1&#xff1a;亲&#xff0c;请教个问题&#xff0c;我这边有200台服务器&#xff0c;怎么看它是否在线呢&#xff1f;答&#xff1a;简单&#xff0c;下载个PingInfoView直接批量ping下&#xff0c;能ping通的就在线&#xff0c;反之离线。问2&#xff1a;那怎么看我这200台…

关于PHP代码的开始和结束标签书写,关于PHP结束标签?gt;的使用细节

当PHP解析一个文件时&#xff0c;会寻找开始&#xff0c;标记告诉PHP开始和停止解释其中的代码。此种方式的解析可以使PHP嵌入到各种不同的文档中&#xff0c;凡是在一对开始和结束标记之外的内容都会被PHP解析器忽略。大多数情况下PHP都是嵌入在HTML文档中的。单行注释仅仅注释…