Oracle 执行计划阅读顺序的总原则是:先上后下,先里后外。
可以通过光标的移动来辅助确认:从 ID=0 开始,根据缩进向下移动,一直移动到出现并列处,并列者上面先执行。
-----------------------------------------------------------
| Id | Operation | Name |
-----------------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | HASH GROUP BY | |
|* 2 | TABLE ACCESS BY INDEX ROWID BATCHED| EMP |
|* 3 | INDEX RANGE SCAN | EMP_JOB_ID |
-----------------------------------------------------------
执行顺序为: 3,2,1
光标从0开始向下找并列行,依次移动到 1,2,3 结束,所以执行顺序为:3,2,1。
-----------------------------------
| Id | Operation | Name |
-----------------------------------
| 0 | SELECT STATEMENT | |
| 1 | UNION-ALL | |
| 2 | TABLE ACCESS FULL| EMP |
| 3 | TABLE ACCESS FULL| DEPT |
| 4 | FAST DUAL | |
-----------------------------------
执行顺序为:2,3,4,1
光标从0列始向下移动,移动到id=2时,出现并列,对于并列,从上到下执行,所以执行顺序为:2,3,4,1
------------------------------------------------
| Id | Operation | Name |
------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | NESTED LOOPS | |
| 2 | NESTED LOOPS | |
|* 3 | TABLE ACCESS FULL | EMP |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT |
|* 5 | TABLE ACCESS BY INDEX ROWID| DEPT |
------------------------------------------------
执行顺序为:3,4,2,5,1
光标从0列始向下移动,移动到id=3时,出现并列,执行完3后执行4,然后返回2,因为2与5并列,先执行2再执行5,然后返回1,执行1,故执行顺序为:3,4,2,5,1
------------------------------------------------
| Id | Operation | Name |
------------------------------------------------
| 0 | SELECT STATEMENT | |
| 1 | NESTED LOOPS | |
| 2 | TABLE ACCESS FULL | EMP |
|* 3 | TABLE ACCESS BY INDEX ROWID| DEPT |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT |
------------------------------------------------
执行顺序:2,4,3,1
光标从0列始向下移动,移动到id=2时,出现并列,先执行2,然后执行3时,有缩进,光标向下移动到4,执行4,执行完4后返回3,执行3,执行完3后,返回1,执行1,故执行顺序为:2,4,3,1
------------------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | FILTER | |
| 2 | TABLE ACCESS FULL | EMP |
|* 3 | TABLE ACCESS BY INDEX ROWID| DEPT |
|* 4 | INDEX UNIQUE SCAN | PK_DEPT |
|* 5 | TABLE ACCESS FULL | BONUS |
------------------------------------------------
执行顺序:2,4,3,5,1
光标从0列始向下移动,移动到id=2时,出现并列,先执行2,然后执行3时,有缩进,光标向下移动到4,执行4,执行完4后返回3,执行3,执行完3后,执行并列的5,执行完5后,返回1,执行1,故执行顺序为:2,4,3,5,1
------------------------------------
| 0 | UPDATE STATEMENT | |
| 1 | UPDATE | EMP |
| 2 | TABLE ACCESS FULL | EMP |
| 3 | SORT AGGREGATE | |
|* 4 | TABLE ACCESS FULL| EMP |
| 5 | SORT AGGREGATE | |
| 6 | TABLE ACCESS FULL| EMP |
------------------------------------
执行顺序:2,4,3,6,5,1
光标从0列始向下移动,移动到id=2时,出现并列,先执行2,然后执行3时,有缩进,光标向下移动到4,执行4,执行完4后返回3,执行3,执行完3后,执行并列的5,但有缩进,光标向下移动到6,执行6,执行完6后,返回5,执行完5后,返回1,执行1,故执行顺序为:2,4,3,6,5,1
----------------------------------------------------------
| 0 | SELECT STATEMENT | |
|* 1 | CONNECT BY WITH FILTERING | |
|* 2 | TABLE ACCESS FULL | EMP |
| 3 | NESTED LOOPS | |
| 4 | CONNECT BY PUMP | |
| 5 | TABLE ACCESS BY INDEX ROWID | EMP |
|* 6 | INDEX RANGE SCAN | EMP_MGR_I |
----------------------------------------------------------
执行顺序:2,4,6,5,3,1
光标从0列始向下移动,移动到id=2时,出现并列,先执行2,然后执行3时,有缩进,光标向下移动到4出现并列,先执行4,然后执行并列的5时,有缩进,光标向下移动到6,执行6,执行完6后返回5,执行5,执行完5后返回3,执行3执行完3后返回1,执行1,故顺序为:2,4,6,5,3,1