Oracle分页查询性能优化代码详解
网络编程 2021-07-05 16:08www.168986.cn编程入门
这篇文章主要介绍了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 引入到第二层,却得到了一个完全不一样的执行计划,注意在执行计划中的 skey,它是 8i 引入的新操 作,这种操作专门为提取 Top n 的需求做了优化。
从上面的例子可以再想到,因为 skey 的功能影响到了分页的一致性读的多少,会不会越往后翻页速度就越慢呢?事实也的确如此,例如
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分页查询性能优化代码详解的全部内容,希望对大家有所帮助。欢迎大家参阅本站其他有关专题,有什么问题可以随时留言,长沙网络推广会及时回复大家的。
编程语言
- 如何快速学会编程 如何快速学会ug编程
- 免费学编程的app 推荐12个免费学编程的好网站
- 电脑怎么编程:电脑怎么编程网咯游戏菜单图标
- 如何写代码新手教学 如何写代码新手教学手机
- 基础编程入门教程视频 基础编程入门教程视频华
- 编程演示:编程演示浦丰投针过程
- 乐高编程加盟 乐高积木编程加盟
- 跟我学plc编程 plc编程自学入门视频教程
- ug编程成航林总 ug编程实战视频
- 孩子学编程的好处和坏处
- 初学者学编程该从哪里开始 新手学编程从哪里入
- 慢走丝编程 慢走丝编程难学吗
- 国内十强少儿编程机构 中国少儿编程机构十强有
- 成人计算机速成培训班 成人计算机速成培训班办
- 孩子学编程网上课程哪家好 儿童学编程比较好的
- 代码编程教学入门软件 代码编程教程