1. -分页参数:size = 20 page = 2
  2. --没有order by的查询
  3. -- 嵌套子查询,两次筛选(推荐使用)
  4. --SELECT *
  5. -- FROM (SELECT ROWNUM AS rowno, t.*
  6. -- FROM DONORINFO t
  7. -- WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
  8. -- AND TO_DATE ('20060731', 'yyyymmdd')
  9. -- AND ROWNUM <= 20*2) table_alias
  10. -- WHERE table_alias.rowno > 20*(2-1); --耗时0.05s
  11.  
  12. -- 一次筛选(数据量大的时候,第一次查询的数据量过大,明显比上面慢,不推荐)
  13. --select * from(
  14. --SELECT ROWNUM AS rowno, t.*
  15. --FROM DONORINFO t
  16. --WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd')
  17. --) r
  18. --where r.rowno BETWEEN 20*(2-1)+1 and 20*2; --耗时0.46s
  19.  
  20. --有order by的查询
  21. --嵌套子查询,两次筛选(推荐使用)
  22. --SELECT *
  23. --FROM (SELECT ROWNUM AS rowno,r.*
  24. -- FROM(
  25. -- SELECT * FROM DONORINFO t
  26. -- WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
  27. -- AND TO_DATE ('20060731', 'yyyymmdd')
  28. -- ORDER BY t.BIRTHDAY desc
  29. -- ) r
  30. -- where ROWNUM <= 20*2
  31. -- ) table_alias
  32. -- WHERE table_alias.rowno > 20*(2-1); --耗时0.744s
  33.  
  34. -- 一次筛选(数据量大的时候,第一次查询的数据量过大,明显比上面慢,不推荐)
  35. --select * from (
  36. --SELECT ROWNUM AS rowno,r.*
  37. --FROM(
  38. --SELECT * FROM DONORINFO t
  39. --WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
  40. --AND TO_DATE ('20060731', 'yyyymmdd')
  41. --ORDER BY t.BIRTHDAY desc
  42. --) r
  43. ----where ROWNUM <= 20; --这里用>查不到数据 =也查不到数据 <= 或者 < 可以查到数据
  44. ----where ROWNUM BETWEEN 20*(2-1)+1 AND 20*2; --查不到数据
  45. ----where ROWNUM <=20*2 and ROWNUM > 20*(2-1); --查不到数据
  46. ----这是因为查询时,第一条生成的rownum1,1>20不成立,1=20也不成立,所以这条数据就作废了,依次类推,这样就查不到任何一条数据
  47. --) t
  48. --where t.rowno <=20*2 and t.rowno > 20*(2-1); --可以查到数据耗时:3.924s
  49. ---- where t.rowno BETWEEN 20*(2-1)+1 AND 20*2; --可以查到数据耗时:3.919s
  50.  
  51. --采用row_number() over 分页函数
  52. --select *
  53. --from(select d.*,row_number() over(order by d.BIRTHDAY) as rownumber
  54. -- from DONORINFO d
  55. -- WHERE d.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
  56. -- AND TO_DATE ('20060731', 'yyyymmdd')
  57. -- ) p
  58. --where p.rownumber BETWEEN 20*(2-1)+1 AND 20*2; --耗时0.812s
  59.  
  60. select * from (
  61. select *
  62. from(select d.*,row_number() over(order by d.BIRTHDAY) as rownumber
  63. from DONORINFO d
  64. WHERE d.BIRTHDAY BETWEEN TO_DATE ('', 'yyyymmdd')
  65. AND TO_DATE ('', 'yyyymmdd')
  66. ) p
  67. where p.rownumber <20*2
  68. ) where rownumber > 20*(2-1); -- 耗时0.813s

从以上探索,我们得知:

(1)ROWNUM

rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。它取得第一条记录则rownum值为1,第二条为2,依次类推。

当使用条件查询时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,会被删除,下条的rownum还是1,所以上限条件必须放在子查询,而下限条件必须放在外层查询。

(2)between and 和>=and <=

这两者查询效率上来说没有区别,between and 最终也是转为>= and <=

(3)Oracle通用分页格式

没有order by

  1. SELECT *
  2. FROM (SELECT ROWNUM AS rowno, t.*
  3. FROM DONORINFO t
  4. WHERE t.BIRTHDAY BETWEEN TO_DATE ('', 'yyyymmdd')
  5. AND TO_DATE ('', 'yyyymmdd')
  6. AND ROWNUM <= page*size) table_alias
  7. WHERE table_alias.rowno > (page-1)*size;

有order by

  1. SELECT *
  2. FROM (SELECT ROWNUM AS rowno,r.*
  3. FROM(SELECT * FROM DONORINFO t
  4. WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')
  5. AND TO_DATE ('20060731', 'yyyymmdd')
  6. ORDER BY t.BIRTHDAY desc
  7. ) r
  8. where ROWNUM <= page*size
  9. ) table_alias
  10. WHERE table_alias.rowno > (page-1)*size;

  

转地址:https://blog.csdn.net/CHS007chs/article/details/80115506

Oracle高效分页查询(转)的更多相关文章

  1. oracle高效分页查询总结

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

  2. Oracle中分页查询语句

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

  3. Oracle的分页查询语句优化

    Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. (一)   分页查询格式: SELECT * FROM  ( SELECT A.*, ROWNUM RN  FROM (SELECT ...

  4. Oracle 的分页查询 SQL 语句

    Oracle的分页查询语句基本上可以按照本文给出的格式来进行套用. 分页查询格式: SELECT * FROM (SELECT A.*, ROWNUM RN FROM (SELECT * FROM T ...

  5. Oracle 数据库分页查询的三种方法

    一.Oracle 数据库分页查询的三种方法 1.简介 不能对 rownum 使用 >(大于或等于 1 的数值).>=(大于 1 的数值).=(不等于 1 的数值),否则无结果.所以直接用 ...

  6. oracle 的分页查询与mysql 的分页查询

    oracle 的分页查询: select * from (select o.*,rownum rn  from Persons o) where rn >40 and rn <=60 : ...

  7. mysql、sql server、oracle数据库分页查询及分析(操作手册)

    1.mysql分页查询 方式1: select * from table order by id limit m, n; 该语句的意思为,查询m+n条记录,去掉前m条,返回后n条记录.无疑该查询能够实 ...

  8. Oracle中分页查询语句的写法

    要动态的变化分页查询的条件,比如pageNow 这个变量表示的是当前是第几页, oracle分页有通用写法,假设一页5行 select * from ( select t.*,rownum rn fr ...

  9. Oracle的分页查询及内联视图和函数处理

    1.Oracle的分页常用方式: select * from(select * ,ROWNUM num from table where ROWNUM<=20 ) where num>0; ...

随机推荐

  1. Linux 搜某个文件里关键字的上下500行到执行文件里

    Linux 搜某个文件里关键字的上下500行到执行文件里grep '300000111110' -C 500 ./saastom7061_APP3/logs/sass.log >/app/saa ...

  2. 初识Dubbo+Zookeeprt搭建SOA项目

    由于工作中天天和Dubbo打交道,天天写对外服务,所以有必要自己动手搭建一个Dubbo+zookeeper项目来更更深层次的认识Dubbo 首先了解一下SOA: 英文名称(Service Orient ...

  3. Windows 10 IoT Serials 11 – 如何设置微软认知服务中EndPoint

    1.问题描述 在UWP应用开发过程中,如果要使用微软认知服务,很多开发者会使用Microsoft.Oxford.Face.Microsoft.Oxford.Vision的NuGet包来完成.如果在vi ...

  4. Android X 相关汇总

    一.说明 官方原文如下: We hope the division between android.* and androidx.* makes it more obvious which APIs ...

  5. Webview 浏览器开源项目总结

    在Android开发中,我们不免会遇到使用WebView实现网页展示的需求,以下是本人之前star的开源项目,供大家参考: 一.CrosswalkWebview 项目地址:https://github ...

  6. Docker学习笔记-两种发布方式

    第一种,自己手写dockerfile发布,上传至hubDocker 正常发布到文件夹中,发布文件上传至linux机器上.如 /www/app 将Dockerfile文件也复制到同目录 ./www/ap ...

  7. 微信昵称的emoji的尝试性解决方案

    概述 之前分享过前端页面使用emoji,讨论了前端页面使用emoji的方法,但是微信昵称中的emoji怎么获取和显示呢?我查找了一些资料,把心得记录下来,供以后开发时参考,相信对其他人也有用. 转码问 ...

  8. Aseprite入门教程

    因为最近在学cocos2d-x和vs搭配做手机游戏开发,想自己做一些素材,所以找到了这款软件,Aseprite v1.1.12.刚安装上时也是不懂该怎么操作,随着逐渐地摸索,对初始的使用有了一些了解. ...

  9. db2 报错 sqlcode=-420 自动类型转换的问题

    今天在测试遇到一个问题,前台点击页面查询数据时报错: , SQLSTATE, SQLERRMC=DECFLOAT, DRIVER=4.18.60 根据sqlcode查询错误原因为:-420 22018 ...

  10. VIM简单配置

    配置vim配置 编辑配置文件 feng@mint ~ $ vim ~/.vimrc 配置如下 主要配置为自动换行,设置行号,设置tab键为4个空格,同时将tab键自动转换成空格 set autoind ...