oracle高效分页查询总结
来源:互联网 发布:通风管道计算软件 编辑:程序博客网 时间:2024/05/16 15:33
本文参考链接:http://blog.sina.com.cn/s/blog_8604ca230100vro9.html
探索查询语句:
--分页参数:size = 20 page = 2--没有order by的查询-- 嵌套子查询,两次筛选(推荐使用)--SELECT *-- FROM (SELECT ROWNUM AS rowno, t.*-- FROM DONORINFO t-- WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')-- AND TO_DATE ('20060731', 'yyyymmdd')-- AND ROWNUM <= 20*2) table_alias-- WHERE table_alias.rowno > 20*(2-1); --耗时0.05s-- 一次筛选(数据量大的时候,第一次查询的数据量过大,明显比上面慢,不推荐)--select * from(--SELECT ROWNUM AS rowno, t.*--FROM DONORINFO t--WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd')--) r--where r.rowno BETWEEN 20*(2-1)+1 and 20*2; --耗时0.46s--有order by的查询--嵌套子查询,两次筛选(推荐使用)--SELECT *--FROM (SELECT ROWNUM AS rowno,r.*-- FROM(-- SELECT * FROM DONORINFO t-- WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')-- AND TO_DATE ('20060731', 'yyyymmdd')-- ORDER BY t.BIRTHDAY desc-- ) r-- where ROWNUM <= 20*2 -- ) table_alias-- WHERE table_alias.rowno > 20*(2-1); --耗时0.744s-- 一次筛选(数据量大的时候,第一次查询的数据量过大,明显比上面慢,不推荐)--select * from (--SELECT ROWNUM AS rowno,r.*--FROM(--SELECT * FROM DONORINFO t--WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')--AND TO_DATE ('20060731', 'yyyymmdd')--ORDER BY t.BIRTHDAY desc--) r----where ROWNUM <= 20; --这里用>查不到数据 =也查不到数据 <= 或者 < 可以查到数据 ----where ROWNUM BETWEEN 20*(2-1)+1 AND 20*2; --查不到数据----where ROWNUM <=20*2 and ROWNUM > 20*(2-1); --查不到数据----这是因为查询时,第一条生成的rownum为1,1>20不成立,1=20也不成立,所以这条数据就作废了,依次类推,这样就查不到任何一条数据--) t --where t.rowno <=20*2 and t.rowno > 20*(2-1); --可以查到数据耗时:3.924s---- where t.rowno BETWEEN 20*(2-1)+1 AND 20*2; --可以查到数据耗时:3.919s--采用row_number() over 分页函数--select * --from(select d.*,row_number() over(order by d.BIRTHDAY) as rownumber -- from DONORINFO d-- WHERE d.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd')-- AND TO_DATE ('20060731', 'yyyymmdd')-- ) p --where p.rownumber BETWEEN 20*(2-1)+1 AND 20*2; --耗时0.812sselect * from (select * from(select d.*,row_number() over(order by d.BIRTHDAY) as rownumber from DONORINFO d WHERE d.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd') ) p where p.rownumber <20*2) where rownumber > 20*(2-1); -- 耗时0.813s
从以上探索比较,我们得知:
1、ROWNUM
rownum总是从1开始的,第一条不满足去掉的话,第二条的rownum 又成了1。依此类推,所以永远没有满足条件的记录。
可以这样理解:rownum是一个序列,是Oracle数据库从数据文件或缓冲区中读取数据的顺序。
它取得第一条记录则rownum值为1,第二条为2。依次类推。
当使用“>、>=、=、between...and”这些条件时,从缓冲区或数据文件中得到的第一条记录的rownum为1,不符合sql语句的条件,会被删除,接着取下条。
下条的rownum还会是1,又被删除,依次类推,便没有了数据。
所以上限条件必须放在子查询,而下限条件必须放在外层查询。
2、between and 和 >= and <=
这两者查询效率上来说没有区别,between and 最终也是转为>= and <=
所以select * from (select * from a where a.time >= to_date('19920324','yyyymmdd')) b where b.time <= to_date('20170324','yyyymmdd')
这样的嵌套是没有必要的,可以直接用between and。
3、Oracle通用分页格式
对于没有order by语句的分页:
SELECT *FROM (SELECT ROWNUM AS rowno, t.* FROM DONORINFO t WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd') AND ROWNUM <= page*size) table_aliasWHERE table_alias.rowno > (page-1)*size;
有order by语句的分页
SELECT *FROM (SELECT ROWNUM AS rowno,r.* FROM(SELECT * FROM DONORINFO t WHERE t.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd') ORDER BY t.BIRTHDAY desc ) r where ROWNUM <= page*size ) table_aliasWHERE table_alias.rowno > (page-1)*size;
另外我们也可以使用row_number() over函数:
select * from(select d.*,row_number() over(order by d.BIRTHDAY) as rownumber from DONORINFO d WHERE d.BIRTHDAY BETWEEN TO_DATE ('19800101', 'yyyymmdd') AND TO_DATE ('20060731', 'yyyymmdd') ) p where p.rownumber BETWEEN size*(page-1)+1 AND page*size;
但是相比前面的并没有什么优势。
0 0
- oracle高效分页查询总结
- oracle高效分页查询总结
- Oracle数据库查询高效分页
- Oracle数据库查询高效分页
- Oracle数据库查询高效分页
- Oracle数据库查询高效分页
- Oracle数据库查询高效分页
- Oracle数据库查询高效分页
- Oracle数据库查询高效分页
- Oracle之分页高效查询
- Oracle数据库查询高效分页
- Oracle数据库查询高效分页
- ORACLE分页查询总结
- SQLSERVER,ORACLE,MYSQL高效分页查询
- SQLSERVER,ORACLE,MYSQL高效分页查询
- SQLSERVER,ORACLE,MYSQL高效分页查询
- SQL Server,Oracle,MySQL高效分页查询
- Oracle sql分页查询(高效)
- CAS单点登录(SSO)服务端的部署和配置---连接MySQL进行身份认证
- 使用JavaEE的ServerAuthModule模块和web.xml进行相应配置,实现对用户的权限控制
- nodejs querystring踩坑笔记----只能用于表单提交
- 配置web.xml和glassfish容器实现javaEE表单验证
- glassfish PWC6351: In TLD scanning 系统找不到指定的文件问题解决
- oracle高效分页查询总结
- 5-59 大笨钟 (10分)
- 华杰电气光伏无线数据终端接入说明
- 自定义video视频
- Linux ALSA指南(zz)
- javaScript中的设计模式(5)单例模式
- nginx集群 配置和js 和 css 文件的访问
- UVA
- 在Linux上将自定义的 jar 包注册为 linux 服务 service