oracle分页查询性能优化代码详细解决方案
以下两种分页技术通常可用。
选择*(从
行号RN,T T)从表
在RN和RN <= > minnum maxnum
也许
选择*(从
行号RN,T *表t rownum <= maxnum)
在RN > minnum
看似相似的分页语句在响应速度上非常不同。
SQL >创建测试表为SELECT * FROM dba_objects;
并重复插入相同的数据。
从测试中插入到测试选择*;
最后,查询表,您可以看到表的记录数大约是80万。
从测试中选择计数(*)
计数(*)
----------
八十三万一千一百零四
现在,在第一种分页方法中,分别使用了两种分页方法:
选择*(从
2行号RN,T * T)测试
3,RN>0,RN=50;
已经选了50行。
所用时间:00:00:1.03
执行计划
----------------------------------------------------------
0选择语句优化器=选择(成本= 10卡= 65字节= 12350)
10视图(成本= 10卡= 65字节= 12350)
21计数
32访问表(全)of'test(成本= 10卡= 65字节= 5590)
统计
----------------------------------------------------------
0递归调用
0分贝块得到
10246一致的获取
0物理读
0重做日志大小
......
正如您所看到的,在这种方法的第一页上有10246个一致性读取,结果是满意的,但如果使用第二种方法,效率很低:
选择*(从
2行号RN,T * T检验
3在rownum <= 50)
4,RN>0;
已经选了50行。
所用时间:00:00:1
执行计划
----------------------------------------------------------
0选择语句优化器=选择(成本= 10卡= 50字节= 9500)
10视图(成本= 10卡= 50字节= 9500)
21计数(stopkey)
32访问表(全)of'test(成本= 10卡= 65字节= 5590)
统计
----------------------------------------------------------
0递归调用
0分贝块得到
82一致的获取
0物理读
0重做日志大小
......
我们得到了相同的结果,一致性读只有82,从上面的例子可以看出,通过引入行号为二层,却得到了一个完全不同的执行计划,注意在stopkey执行计划,这是一个新的操作8I介绍,具体优化的前N要求操作提取。
从上面的例子,我们可以再想想,因为stopkey功能影响分页的一致性,以及页面阅读数,它会减慢页面吗事实是正确的,例如:
选择*(从
2行号RN,T * T检验
3在rownum <= 10000)
4,RN>9950;
已经选了50行。
所用时间:00:00:1.01
统计
----------------------------------------------------------
0递归调用
0分贝块得到
2616一致的获取
0物理读
0重做日志大小
......
当您选择后面的数据时,逻辑读取开始增长,并且在最后几页被选中时,一致性读与上面的类似。
选择*(从
2行号RN,T * T检验
3在rownum <= 800000)
4,RN>799950;
已经选了50行。
所用时间:00:00:1.03
统计
----------------------------------------------------------
0递归调用
0分贝块得到
10242一致的获取
0物理读
0重做日志大小
......
幸运的是,大多数用户只从5%个数据开始,但对最后一个数据不感兴趣。通过第二种改进的分页技术,可以快速方便地显示前端数据,不使用户感觉慢。
总结
这是本文的全部内容,关于oracle分页查询性能优化代码,希望能对您有所帮助。欢迎大家看到其他相关主题的站,什么问题可以留到随时留言,小编辑会及时回复您。