oracle执行计划顺序

     如果要了解执行计划和执行顺序,必须理解执行计划的父子关系。执行计划是一个树状结构,顶层的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

猜你喜欢

转载自yijiangyanyu.iteye.com/blog/1631807