Oracle分页查询性能优化代码详解
发表于:2025-02-12 作者:千家信息网编辑
千家信息网最后更新 2025年02月12日,对于数据库中表的数据的 Web 显示,如果没有展示顺序的需要,而且因为满足条件的记录如此之多,就不得不对数据进行分页处理。常常用户并不是对所有数据都感兴趣的,或者大部分情况下,他们只看前几页。通常有以
千家信息网最后更新 2025年02月12日Oracle分页查询性能优化代码详解
对于数据库中表的数据的 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分页查询性能优化代码详解的全部内容,希望对大家有所帮助。欢迎大家参阅本站其他有关专题,有什么问题可以随时留言,小编会及时回复大家的。
数据
选择
一致
一致性
方式
查询
用户
面的
相似
例子
兴趣
大部分
技术
结果
速度
测试
代码
性能
不对
很大
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
服务器坏了怎么重新配置
台服最多的服务器
敏捷软件开发 mobi
叙述如何做好网络安全工作
ado连接数据库的安全性
互联网+ 网络安全
mc服务器买地
移动网络技术协议
服务器429错误
软件开发 挂靠
济南小程序软件开发服务
软件开发渐进式模型的缺点
pw网络技术
魔兽怀旧服中国服务器
我的世界服务器惊现基岩
吉林省广通网络技术开发有限
移动互联网平台钱咖网络科技
分布式数据库查询
数据库中如何将两个字段联系
变速箱控制器软件开发
网络教育计算机网络技术分数线
江夏售后完善的计算机软件开发
互联网+ 网络安全
贵阳网络安全课程哪里学
智造将来网络安全员
深圳十大网络安全公司排名
华为全球网络安全中心
青岛昊纬网络技术有限公司
服务器装了软件打不开
软件开发核心素养