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行。
已用时间: 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
已选择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%的数据,而没有兴趣看最后面的数据,通过第二种改良的分页技术,可以方便快速地显示前面的数据,而且不会让用户感觉到慢。
总结
本篇文章到此结束,如果您有相关技术方面疑问可以联系我们技术人员远程解决,感谢大家支持本站!
我想要获取技术服务或软件
服务范围:MySQL、ORACLE、SQLSERVER、MongoDB、PostgreSQL 、程序问题
服务方式:远程服务、电话支持、现场服务,沟通指定方式服务
技术标签:数据恢复、安装配置、数据迁移、集群容灾、异常处理、其它问题
本站部分文章参考或来源于网络,如有侵权请联系站长。
数据库远程运维 Oracle分页查询性能优化代码详解
相关文章
- Navicat Premium 12连接Oracle时提示oracle library is not loaded的问题解决「建议收藏」
- 架构师必备:Oracle数据库读写分离技术(oracle数据库读写分离)
- 解决Oracle安装过程中的乱码问题(oracle安装乱码)
- 深入Oracle系统学习,发挥更强大性能(oracle系统学习)
- 初学者零基础Oracle入门:初学者必备指南(零基础oracle)
- Oracle索引:让性能更加有效(oracle索引生效)
- Oracle的高效存储结构研究(oracle的存储结构)
- 利用Oracle触发器提高系统性能(oracle触发器类型)
- 利用Oracle触发器改善数据库性能(oracle触发器类型)
- 分析Oracle中的触发器类型及应用(oracle触发器类型)
- Oracle中的动态游标来加速数据处理(动态游标oracle)
- 工具使用Oracle自带报表工具分析数据(oracle自带报表)
- Oracle刷新缓存,提升性能!(oracle刷新缓存)
- Oracle SQL跟踪工具提高SQL性能的利器(oracle跟踪sql工具)
- 如何利用Oracle事件跟踪技术优化数据库性能?(oracle事件跟踪)
- 深入探究Oracle性能监控指标优化的关键技巧(oracle性能监控指标)
- 成为一名Oracle数据库架构师:梦想成真(oracle数据库架构师)
- Oracle:如何优化多CPU架构实现更高的性能?(oracle多cpu)
- Oracle 游标:有助于判断的利器(oracle 游标 判断)
- 使用Oracle内值联函数提升数据库性能(oracle内值联函数)
- 深度探索Oracle八大性能视图(oracle八大性能视图)
- AIX 下Oracle 性能优化实践(aix下oracle优化)
- Oracle新发函数抢先体验(oracle下发函数)
- 数据Oracle和VB结合,实现数据读写(oracle vb读写)
- 调优Oracle PGA值调优从性能提升中获益(oracle pga的值)
- 利用Oracle NVLIF函数解决空值问题(oracle nvlif)