对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如此之多,就不得不对数据进行分页处理。常常用户并不是对所有数据都感兴趣的,或者大部分情况下,他们只看前几页。

通常有以下两种分页技术可供选择。
Select * from ( Select rownum rn,t.* from table t) Where rn>&minnum and rn<=&maxnum 或者 Select * from ( Select rownum rn,t.* from table t rownum<=&maxnum) Where rn>&minnum
看似相似的分页语句,在响应速度上其实有很大的差别。来看一个测试过程,首先创建一个测试表。
SQL>create table test as select * from dba_objects;
并反复地插入相同数据。
SQL>insert into test select * from test;
最后,查询该表,可以看到该表的记录数约为 80 万条。
SQL> select count(*) from test COUNT(*) ---------- 831104
现在分别采用两种分页方式,在第一种分页方式中:
SQL> select * from (
2 select rownum rn,t.* from test t)
3 where rn>0 and rn <=50;
已选择50行。
已用时间: 00: 00: 01.03
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=10 Card=65 Bytes=12350)
1 0 VIEW (Cost=10 Card=65 Bytes=12350)
2 1 COUNT
3 2 TABLE ACCESS (FULL) OF 'TEST' (Cost=10 Card=65 Bytes=5590)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
10246 consistent gets
0 physical reads
0 redo size
……
可以看到,这种方式查询第一页的一致性读有 10246 个,结果满足了,但是效率是很差的,如果采用第二种方式:
SQL> select * from (
2 select rownum rn,t.* from test t
3 where rownum <=50)
4 where rn>0;
已选择50行。
已用时间: 00: 00: 01.00
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=10 Card=50 Bytes=9500)
1 0 VIEW (Cost=10 Card=50 Bytes=9500)
2 1 COUNT (STOPKEY)
3 2 TABLE ACCESS (FULL) OF 'TEST' (Cost=10 Card=65 Bytes=5590)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
82 consistent gets
0 physical reads
0 redo size
……
得到了同样的结果,一致性读只有 82 个,从以上的例子可以看到,通过把 rownum 引入到第二层,却得到了一个完全不一样的执行计划,注意在执行计划中的 stopkey,它是 8i 引入的新操 作,这种操作专门为提取 Top n 的需求做了优化。
从上面的例子可以再想到,因为 stopkey 的功能影响到了分页的一致性读的多少,会不会越往后翻页速度就越慢呢?事实也的确如此,例如:
SQL> select * from (
2 select rownum rn,t.* from test t
3 where rownum <=10000)
4 where rn>9950;
已选择50行。
已用时间: 00: 00: 01.01
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
2616 consistent gets
0 physical reads
0 redo size
……
选择靠后一点的数据时,逻辑读开始变大,当选择到最后几页时,一致性读已经与上面的相似了。
SQL> select * from (
2 select rownum rn,t.* from test t
3 where rownum <=800000)
4 where rn>799950;
已选择50行。
已用时间: 00: 00: 01.03
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
10242 consistent gets
0 physical reads
0 redo size
……
不过,所幸的是,大部分的用户只看开始 5%的数据,而没有兴趣看最后面的数据,通过第二种改良的分页技术,可以方便快速地显示前面的数据,而且不会让用户感觉到慢。
总结
以上就是本文关于Oracle分页查询性能优化代码详解的全部内容,希望对大家有所帮助。欢迎大家参阅本站其他有关专题,有什么问题可以随时留言,小编会及时回复大家的。
# oracle
# 分页查询
# 性能优化
# Oracle实现分页查询的SQL语法汇总
# Oracle分页查询的实例详解
# 详解oracle分页查询的基础原理
# 简单实例解释Oracle分页查询
# Oracle中3种常用的分页查询方法
# 分页
# 可以看到
# 已用
# 两种
# 只看
# 第二种
# 的是
# 得到了
# 有什么
# 就不
# 感觉到
# 会不会
# 它是
# 感兴趣
# 的确如此
# 如果没有
# 会让
# 欢迎大家
# 约为
# 之多
相关文章:
C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)
如何选择CMS系统实现快速建站与SEO优化?
如何通过二级域名建站提升品牌影响力?
建站之星如何助力企业快速打造五合一网站?
如何通过虚拟主机快速完成网站搭建?
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
济南企业网站制作公司,济南社保单位网上缴费步骤?
长沙企业网站制作哪家好,长沙水业集团官方网站?
如何在建站之星绑定自定义域名?
唐山网站制作公司有哪些,唐山找工作哪个网站最靠谱?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
购物网站制作公司有哪些,哪个购物网站比较好?
制作宣传网站的软件,小红书可以宣传网站吗?
大同网页,大同瑞慈医院官网?
英语简历制作免费网站推荐,如何将简历翻译成英文?
如何快速登录WAP自助建站平台?
已有域名和空间,如何快速搭建网站?
网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
如何快速搭建高效可靠的建站解决方案?
html制作网站的步骤有哪些,iapp如何添加网页?
制作网站外包平台,自动化接单网站有哪些?
如何快速重置建站主机并恢复默认配置?
如何通过西部数码建站助手快速创建专业网站?
家庭建站与云服务器建站,如何选择更优?
宝塔建站无法访问?如何排查配置与端口问题?
广州美橙建站如何快速搭建多端合一网站?
深圳网站制作公司好吗,在深圳找工作哪个网站最好啊?
如何高效利用亚马逊云主机搭建企业网站?
建站之星代理如何获取技术支持?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
昆明高端网站制作公司,昆明公租房申请网上登录入口?
建站之星如何快速解决建站难题?
XML的“混合内容”是什么 怎么用DTD或XSD定义
如何在IIS中配置站点IP、端口及主机头?
七夕网站制作视频,七夕大促活动怎么报名?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
如何破解联通资金短缺导致的基站建设难题?
香港服务器建站指南:外贸独立站搭建与跨境电商配置流程
济南网站制作的价格,历城一职专官方网站?
如何通过IIS搭建网站并配置访问权限?
潮流网站制作头像软件下载,适合母子的网名有哪些?
如何在Windows环境下新建FTP站点并设置权限?
广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?
网站制作公司排行榜,抖音怎样做个人官方网站
如何在腾讯云服务器上快速搭建个人网站?
网站制作难吗安全吗,做一个网站需要多久时间?
电视网站制作tvbox接口,云海电视怎样自定义添加电视源?
如何登录建站主机?访问步骤全解析
外贸公司网站制作哪家好,maersk船公司官网?
*请认真填写需求信息,我们会在24小时内与您取得联系。