Oracle执行计划顺序
先从最开头一直往右看,直到看到最右边的并列的地方,对于不并列的,靠右的先执行:对于并列的,靠上的先执行。
即并列的缩进块,从上往下执行,非并列的缩进块,从下往上执行。
如下示例:
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
Oracle执行计划顺序的更多相关文章
- 【Oracle】【9】阅读oracle执行计划
正文: 工具:PLSQL 1,配置执行计划需要显示的项 工具→首选项→窗口类型→计划窗口→根据需要配置要显示在执行计划中的列 2,打开执行计划 在SQL窗口执行完一条select语句后按 F5 即可查 ...
- Oracle执行计划详解
Oracle执行计划详解 --- 作者:TTT BLOG 本文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html --- 简介: ...
- 【转】Oracle执行计划解释
Oracle执行计划解释 一.相关的概念 Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物 ...
- 看懂Oracle执行计划
最近一直在跟Oracle打交道,从最初的一脸懵逼到现在的略有所知,也来总结一下自己最近所学,不定时更新ing- 一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问 ...
- oracle 执行计划详解
简介: 本文全面详细介绍oracle执行计划的相关的概念,访问数据的存取方法,表之间的连接等内容. 并有总结和概述,便于理解与记忆! +++ 目录 --- 一.相关的概念 ...
- [转]Oracle执行计划详解
Oracle执行计划详解 --- 作者:TTT BLOG 本文地址:http://blog.chinaunix.net/u3/107265/showart_2192657.html --- 简介: ...
- Oracle执行计划 explain plan
Rowid的概念:rowid是一个伪列,既然是伪列,那么这个列就不是用户定义,而是系统自己给加上的. 对每个表都有一个rowid的伪列,但是表中并不物理存储ROWID列的值.不过你可以像使用其它列那样 ...
- 转:Oracle 执行计划(Explain Plan) 说明
Oracle 执行计划(Explain Plan) 说明 原贴地址:http://blog.csdn.net/tianlesoftware/article/details/5827245 如果要分 ...
- [转]看懂Oracle执行计划
原文地址:https://www.cnblogs.com/Dreamer-1/p/6076440.html 一:什么是Oracle执行计划? 执行计划是一条查询语句在Oracle中的执行过程或访问路径 ...
随机推荐
- jvm 配置,看看
http://my.oschina.net/qiangzigege/blog/661757
- (中等) POJ 3225 Help with Intervals , 线段树+集合。
Description LogLoader, Inc. is a company specialized in providing products for analyzing logs. While ...
- UISlider小结
滑块(UISlider)是常用的界面组件,能够让用户可以用可视化方式设置指定范围内的值,比如音量设置,比如灵敏度控制等诸如此类的用途. - (void)viewDidLoad { [super vie ...
- Python中下划线---完全解读
Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用'from module import *'导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划 ...
- mongodb 查询时没有索引报错(too much data for sort() with no index)
报错信息: .... too much data for sort() with no index.... 给对应排序字段加索引就OK 了... 在对应"表"名上,右键--> ...
- SpringMVC常用注解@Controller,@Service,@repository,@Component
SpringMVC常用注解@Controller,@Service,@repository,@Component controller层使用@controller注解 @Controller 用于标记 ...
- [Poi2000]公共串 && hustoj2797
传送门:http://begin.lydsy.com/JudgeOnline/problem.php?id=2797 题目大意:给你几个串求出几个串中的最长公共子串. 题解:先看n最大才5,所以很容易 ...
- 【腾讯Bugly干货分享】iOS 中 HTTPS 证书验证浅析
本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/-fLLTtip509K6pNOTkflPQ 导语 本 ...
- 字符集UTF-8MB4 MySQL utf8mb4 字符集,用于存储emoji表情
字符集UTF-8MB4 utf8mb4兼容utf8,且比utf8能表示更多的字符.看unicode编码区从1 - 126就属于传统utf8区,当然utf8mb4也兼容这个区,126行以下就是utf8m ...
- 利用cocoapods创建基于git的私有库
上一篇文章记录了我利用cocoapods创建基于SVN的私有库的全部过程,今天我再记录一下基于git创建的过程. 整体先说明一下创建一个私有的podspec包括如下那么几个步骤: 创建并设置一个私有的 ...