如果要了解执行计划和执行顺序,必须理解执行计划的父子关系。执行计划是一个树状结构,顶层的STATEMENT是这棵树的根。父子关系按照如下的树状结构组织:
PARENT
FIRST CHILD
SECOND CHILD
执行的时候,FIRST CHILD最先执行,然后是SECOND CHILD,这两个步骤执行完毕后,执行PARENT。
PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 3551968854 -------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Byte -------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 323 | 7655 |* 1 | HASH JOIN RIGHT OUTER | | 323 | 7655 | 2 | TABLE ACCESS FULL | JJ_RENYUAN | 1285 | 2827 |* 3 | HASH JOIN | | 323 | 6944 |* 4 | HASH JOIN | | 89 | 1432 |* 5 | HASH JOIN | | 89 | 1326 |* 6 | HASH JOIN RIGHT OUTER | | 89 | 1139 | 7 | TABLE ACCESS FULL | JJ_JIGOU | 151 | 271 | 8 | NESTED LOOPS | | 89 | 979 | 9 | NESTED LOOPS | | 91 | 946 |* 10 | TABLE ACCESS FULL | JJ_SHENGQINGJIAN5 | 91 | 136 |* 11 | TABLE ACCESS BY INDEX ROWID| JJ_SHENGQINGJIAN1 | 1 | 8 |* 12 | INDEX UNIQUE SCAN | PK_JJ_SHENGQINGJIAN1 | 1 | |* 13 | INDEX UNIQUE SCAN | SYS_C0080195 | 1 | | 14 | TABLE ACCESS FULL | JJ_SHENGQINGJIAN3 | 7221 | 14 PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- | 15 | TABLE ACCESS FULL | JBPM_TOKEN | 7716 | 9259 | 16 | TABLE ACCESS FULL | JBPM_TASKINSTANCE | 27728 | 146 -------------------------------------------------------------------------------- Predicate Information (identified by operation id): --------------------------------------------------- 1 - access("RY2"."RENYUAN_ID"(+)=TO_NUMBER("TI"."ACTORID_")) 3 - access("TI"."TOKEN_"="TOO"."ID_") 4 - access("TOO"."PROCESSINSTANCE_"="TP"."ID_") 5 - access("F"."SHENQINGJIAN_ID"="S3"."SHENQINGJIAN_ID") 6 - access("JG"."JIGOU_ID"(+)="F"."JIGOU_ID") 10 - filter("S5"."FINALFLAG"='1' AND "S5"."UPDATETIME">=TO_DATE(' 2008-07-23 0 'syyyy-mm-dd hh24:mi:ss') AND "S5"."UPDATETIME"<=TO_DATE(' 2012-08 hh24:mi:ss')) 11 - filter("F"."YINHANG_NO"='04xx' AND "F"."STATUS"='089-125') 12 - access("F"."SHENQINGJIAN_ID"="S5"."SHENQINGJIAN_ID") 13 - access("TP"."ID_"=TO_NUMBER("F"."FLOWID")) 38 rows selected
依靠缩进关系来看:先从最开头一直往右看,直到看到最右边的并列的地方,对于不并列的,靠右的先执行;如果见到并列的,就从上往下看,对于并列的,靠上的先执行。
按照树状结构,可通过后序遍历(有文章说中序,我认为是后序,左右根的顺序)。
查询v$sql_plan 可获得执行计划顺序表:
select id,parent_id
from v$sql_plan
where plan_hashvalue=3551968854;
查询结果如下:
ID | PARENT_ID |
0 | |
1 | 0 |
2 | 1 |
3 | 1 |
4 | 3 |
5 | 4 |
6 | 5 |
7 | 6 |
8 | 6 |
9 | 8 |
10 | 9 |
11 | 9 |
12 | 11 |
13 | 8 |
14 | 5 |
15 | 4 |
16 | 3 |
根据表中子节点和父节点之间的关系,得到如下二叉树:
后序遍历得到的顺序为2、7、10、12、11、9、13、8、6、14、5、15、4、16、3、1、0