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,一经查实,立即删除!

相关文章

GitHub上创建组织

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

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

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

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

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

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

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

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

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

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

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

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台…

IIS 7.0 部署MVC

开发的MVC 3.0 项目&#xff0c;在部署服务上还是与需要花一点功夫&#xff0c;这里把遇到的问题罗列出来。 本文主要介绍IIS 7.5中安装配置MVC 3.0的具体办法&#xff01; 部署必备&#xff1a; Microsoft .net FrameWork 4.0安装包 安装ASP.NET MVC 3.0 如果 Asp.NET v4.0.30…

不是有效的函数或过程名_过程和函数

VBA代码有两种组织形式&#xff0c;一种是过程&#xff0c;另一种就是函数。其实过程和函数有很多相同之处&#xff0c;除了使用的关键字不同之外&#xff0c;还有不同的是&#xff1a;函数有返回值&#xff0c;过程没有。函数可以在Access窗体&#xff0c;查询中像一般的Acces…

浏览器快捷键_浏览器快捷键,让你事半功倍

随着互联网时代的发展&#xff0c;手机、电脑已经成为人们生活中不可或缺得一部分&#xff0c;无论是生活还是工作。尤其是办公室族&#xff0c;几乎每天都要面对电脑7/8个小时&#xff0c;查找各种信息或者浏览新闻&#xff0c;浏览器无可厚非的成为了装机必备的软件&#xff…

小程序iconfont报错_【经验】开发微信小程序经验总结

一.技术要求(语言方面)有H5或H4和CSS3的书写经验&#xff0c;没有建议观看B站中的 渡一教育-Web前端开发(html css不算语言)。强烈推荐他们的视频&#xff0c;主讲人没有口音且视频质量很高&#xff0c;是哈尔滨理工大学毕业之后进入阿里工作的Web前端工程师 姬成老师。JavaScr…

python移动端web开发代码_移动web前端开发,前端开发工作总结,移动端页面开发-我主页-一个前端程序猿的博客...

热门推荐html/css一、escape和它们不是同一类简单来说&#xff0c;escape是对字符串(string)进行编码(而另外两种是对URL)&#xff0c;作用是让它们在所有电脑上可读。编码之后的...标签&#xff1a;03-22html/css场景&#xff1a; 在项目开发过t程中需要找到url中某个参数的值…

【BZOJ】【1086】 【SCOI2005】王室联邦

树分块 orz vfk && PoPoQQQ http://vfleaking.blog.163.com/blog/static/174807634201231684436977/http://blog.csdn.net/popoqqq/article/details/42772237 这题是要把树分成一块一块的……&#xff08;感觉好像不是原来理解的树分块处理操作啊……&#xff09; 每块…

红黑树和平衡二叉树的区别_面试题精选红黑树(c/c++版本)

红黑树的使用场景非常广泛&#xff0c;比如nginx中用来管理timer、epoll中用红黑树管理事件块&#xff08;文件描述符&#xff09;、Linux进程调度Completely Fair Scheduler用红黑树管理进程控制块、CSTL中map,set的底层实现全是用的红黑树。掌握红黑树的原理以及使用场景&…

linux中按行读取文件,Linux按行读取文件内容

方法1&#xff1a;while循环中执行效率最高&#xff0c;最常用的方法。function while_read_LINE_bottm(){While read LINEdoecho $LINEdone < $FILENAME}#!/bin/bashwhile read linedoecho $linedone < filename(待读取的文件)注释&#xff1a;习惯把这种方式叫做read釜…

酱油和gbt酱油哪个好_酱油越贵越好?认准瓶身这4处,轻松挑到好酱油!

买酱油这件事&#xff0c;爷叔阿姨们都不陌生。现在市面上酱油品种很多&#xff0c;除了普通的生抽、老抽以外&#xff0c;还有些别的口味&#xff0c;比如海鲜酱油、菌菇酱油等等&#xff0c;价格比普通的还高出不少&#xff0c;这些酱油真的更鲜更好吗&#xff1f;买酱油的2大…

linux网站465端口是什么端口,发送端口25,465,587端口疑问解答

25端口(SMTP)&#xff1a;25端口为SMTP(Simple Mail Transfer Protocol&#xff0c;简单邮件传输协议)服务所开放的&#xff0c;是用于发送邮件。如今绝大多数邮件服务器都使用该协议。当你给别人发送邮件时&#xff0c;你的机器的某个动态端口(大于1024)就会与邮件服务器的25号…

uml 时序图_程序猿都应学习的语言:看 25 张图学 UML

作者 | 逸珺责编 | 屠敏来源 | 嵌入式客栈作为程序猿都最好掌握的一门语言&#xff0c;那就是UML(Unified Modeling Language)&#xff0c;统一建模语言(UML)是软件工程领域中一种通用的开发建模语言&#xff0c;旨在提供一种可视化系统设计的标准方法。是开发人员、系统设计人…

新服务器的配置

新服务器的安装好那三款软件后还是打不开会报错&#xff0c;去服务器管理网站增加执行权即可。 转载于:https://www.cnblogs.com/longhun/p/4266665.html