免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1561 | 回复: 3
打印 上一主题 下一主题

(转)阅读oracle执行计划的方法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-05-29 22:43 |只看该作者 |倒序浏览
这个只是一些最简单的方法,当然还有一些特殊的地方。
先从最开头一直往右看,直到看到最右边的并列的地方,对于不并列的,靠右的先执行:对于并列的,靠上的先执行。
       即并列的缩进块,从上往下执行,非并列的缩进块,从下往上执行。
如下示例:
Execution Plan
----------------------------------------------------------
    0      SELECT STATEMENT Optimizer=CHOOSE
    1    0   NESTED LOOPS
    2    1     TABLE ACCESS (BY INDEX ROWID) OF 'TB_HOST_BATCH_DTL'
    3    2       INDEX (RANGE SCAN) OF 'XIE2TB_HOST_BATCH_DTL' (NON-UNIQUE)
    4    1     TABLE ACCESS (BY INDEX ROWID) OF 'TB_BATCH_TRAN_CTRL'
    5    4       INDEX (UNIQUE SCAN) OF 'SYS_C0034652' (UNIQUE)
不妨假设最右边的数据为行号,语句执行是按块进行的。
从上述执行计划的开头一直往右看,直到找到最右边并列的。也就是从SELECT STATEMENT开始往右找。
找到一级缩进块,只有一个,没有优先级可言,如下:
    1    0   NESTED LOOPS
    2    1     TABLE ACCESS (BY INDEX ROWID) OF 'TB_HOST_BATCH_DTL'
    3    2       INDEX (RANGE SCAN) OF 'XIE2TB_HOST_BATCH_DTL' (NON-UNIQUE)
    4    1     TABLE ACCESS (BY INDEX ROWID) OF 'TB_BATCH_TRAN_CTRL'
    5    4       INDEX (UNIQUE SCAN) OF 'SYS_C0034652' (UNIQUE)
再在一级缩进块中找二级缩进块,找到两个,如下:
    第一个二级缩进块:
    2    1     TABLE ACCESS (BY INDEX ROWID) OF 'TB_HOST_BATCH_DTL'
    3    2       INDEX (RANGE SCAN) OF 'XIE2TB_HOST_BATCH_DTL' (NON-UNIQUE)
    第二个二级缩进块:
    4    1     TABLE ACCESS (BY INDEX ROWID) OF 'TB_BATCH_TRAN_CTRL'
    5    4       INDEX (UNIQUE SCAN) OF 'SYS_C0034652' (UNIQUE)
按照并列块从上往下执行的原则,第一个二级缩进块的所有语句将优先于第二个二级缩进块的语句执行。
而两个二级缩进块执行完,才能执行一级缩进块,这是因为非并列的缩进块,从下往上执行。

再在二级缩进块中找三级缩进块。
第一个二级缩进块中只有一个三级缩进块,如下:
    3    2       INDEX (RANGE SCAN) OF 'XIE2TB_HOST_BATCH_DTL' (NON-UNIQUE)
由于没有更低层级的缩进块,因此,该块最先执行。然后执行二级缩进块。

第二个二级缩进块中也只有一个三级缩进块,如下:
    5    4       INDEX (UNIQUE SCAN) OF 'SYS_C0034652' (UNIQUE)
二级缩进块中没有更低层次的缩进块了,因此,执行完第一个二级缩进块的所有语句后,便执行此三级缩进块,再执行对应的二级缩进块。
两个二级缩进块均执行完成后,再执行整个一级缩进块。
因此,若按行排序,语句的执行顺序便是: 3 -> 2 -> 5 -> 4 -> 1, 即:
    3    2       INDEX (RANGE SCAN) OF 'XIE2TB_HOST_BATCH_DTL' (NON-UNIQUE)   ->
    2    1     TABLE ACCESS (BY INDEX ROWID) OF 'TB_HOST_BATCH_DTL'           ->
    5    4       INDEX (UNIQUE SCAN) OF 'SYS_C0034652' (UNIQUE)               ->
    4    1     TABLE ACCESS (BY INDEX ROWID) OF 'TB_BATCH_TRAN_CTRL'          ->
    1    0   NESTED LOOPS
执行计划顺序的理论解释:
执行计划是按一定规则显示的,如下:
Execution Plan
----------------------------------------------------------
    0      SELECT STATEMENT Optimizer=CHOOSE
    1    0   NESTED LOOPS
    2    1     TABLE ACCESS (BY INDEX ROWID) OF 'TB_HOST_BATCH_DTL'
    3    2       INDEX (RANGE SCAN) OF 'XIE2TB_HOST_BATCH_DTL' (NON-UNIQUE)
    4    1     TABLE ACCESS (BY INDEX ROWID) OF 'TB_BATCH_TRAN_CTRL'
    5    4       INDEX (UNIQUE SCAN) OF 'SYS_C0034652' (UNIQUE)
第一个列是步骤的ID (相当于我们说的行号)
第二个列是父步骤的ID
第三个列是该步骤要进行的操作。
在执行过程中,父步骤依赖于子步骤。只有对应的所有子步骤执行完,才能执行父步骤。
因此,步骤0的子步骤为1, 步骤1的子步骤为2,4, 步骤2子步骤为3,步骤4的子步骤为5, 步骤3,5没有子步骤了。
故步骤3所在的模块,或步骤5所在的模块先执行。但步骤3排在步骤5的前面,故步骤3所在的模块先执行。因此,顺序仍是:
3 -> 2 -> 5 -> 4 -> 1

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
2 [报告]
发表于 2012-06-09 19:11 |只看该作者
nola_r 发表于 2012-05-29 22:43
这个只是一些最简单的方法,当然还有一些特殊的地方。
先从最开头一直往右看,直到看到最右边的并列的地方 ...

好,先回复再学习。

论坛徽章:
0
3 [报告]
发表于 2012-06-14 10:29 |只看该作者
这作者是谁啊,写的可真够难懂的。真是误 人子弟


老纳来简单说说,读懂执行计划的八字真言:

从下往上,由内而外。

论坛徽章:
1
辰龙
日期:2013-11-20 14:55:50
4 [报告]
发表于 2012-06-14 10:48 |只看该作者
先看看,有点长了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP