网站首页 > 技术文章 正文
实际开发过程中难免接触到Oracle数据库。而数据库的分页又是我们最常用的语句之一,而且面试问的频率也很高。Oracle数据库的分页不像Mysql数据库用一个limit就搞定那么简单。该篇文章为大家介绍Oracle数据库的通用写法,以便大家熟悉Oracle数据库的分页写法。
分页查询格式:
其中最内层的查询语句SELECT * FROM 表名表示不进行翻页的原始查询语句。ROWNUM <= 20和RN >= 11控制分页查询的每页范围。
上述的Oracle分页查询格式,在大多数情况拥有较高的效率。
查询数据11-20条的记录有两种方法,一种是上述例子中展示的在查询的第二层通过ROWNUM <= 20来控制最大值,在查询的最外层控制最小值。而另一种方式是去掉查询第二层的WHERE ROWNUM <= 20语句,在查询的最外层控制分页的最小值和最大值。查询语句如下:
对比这两种写法,绝大多数的情况下,第一个查询的效率比第二个高得多。
这是因为在CBO 优化模式下,Oracle可以将外层的查询条件推到内层查询中,以提高内层查询的执行效率。对于第一个查询语句,第二层的查询条件WHERE ROWNUM <= 20就可以被Oracle推入到内层查询中,这样Oracle查询的结果一旦超过了ROWNUM限制条件,就终止查询将结果返回了。
而第二个查询语句,由于查询条件BETWEEN 11 AND 20是存在于查询的第三层,而Oracle无法将第三层的查询条件推到最内层。因此,对于第二个查询语句,Oracle最内层返回给中间层的是所有满足条件的数据,而中间层返回给最外层的也是所有数据。数据的过滤在最外层完成,显然这个效率要比第一个查询低得多。
对于第一种理解的话还是从里面向外面更好一些,先是从一个表中获得数据select * from 表名,再给这个表赋上RN的值并且将索取的行数确定为20行select a.*,rownum rn from (select * from 表名) a where rownum<=20,之后再确定从哪一行开始select * from (select a.*,rownum rn from (selecct * from table_name) a where rownum<=20) where rn>=11
上面分析的查询不仅仅是针对单表的简单查询,对于最内层查询是复杂的多表联合查询或最内层查询包含排序的情况一样有效。
最后祝大家工作顺利,天天开心!!!
猜你喜欢
- 2024-10-16 MySQL 使用 limit 分页会导致数据丢失、重复和索引失效
- 2024-10-16 elasticsearch 分页查询 search_after 深分页
- 2024-10-16 SpringBoot整合oceanbase,实现oracle无缝切换到oceanbase
- 2024-10-16 百万数据导出Excel,通过优化深度分页和线程编排,效...
- 2024-10-16 Mongodb 分页查询与排序查询 mongodb排序查询sort
- 2024-10-16 MVC模式下用Servlet和jsp分页的HelloWord
- 2024-10-16 elasticsearch 分页查询scroll 深分页
- 2024-10-16 京东终面:ElasticSearch深度分页如何优化?
- 2024-10-16 spring boot封装通用的查询+分页接口
- 2024-10-16 Elasticsearch 分页查询 from + size 浅分页
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)