----------------------------------------------------------------------------------------------------------------------------
| ID | 操作 | 名称 | 行数 | 字节 | 代价 |
----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATMENT | | | | |
| 1 | SORT GROUP BY | | | | |
| 2 | MERGE JOIN | | | | |
| 3 | SORT JOIN | | | | |
| 4 | TABLE ACCESS FULL | RESULTS | | | |
| 5 | SORT JOIN | | | | |
| 6 | TABLE ACCESS FULL | WAIT_STATS | | | |
这样看:
从上往下数,数到前面空格最多的,很显然是4 ,(不是第6,因为5比4要少一个空格,不能越界),那么就是说ORACLE是从第4开始,
然后全表扫描results,然后往上做sort join,也就是做第3步
此时发现第3和第5空格数相等,所以不能往上了。 应该做6然后做5.
最后做2-》1-》结果
例如:
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=3 Card=8 Bytes=248)
1 0 HASH JOIN (Cost=3 Card=8 Bytes=248)
2 1 TABLE ACCESS (FULL) OF ‘DEPT’ (Cost=1 Card=3 Bytes=36)
3 1 TABLE ACCESS (FULL) OF ‘EMP’ (Cost=1 Card=16 Bytes=304)
注意这个执行计划的最左边的两个列,第一个列是步骤的ID,第二个列是父步骤的
ID。执行从ID=0的行开始:
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=3 Card=8 Bytes=248)
这个步骤没有父步骤,有一个子步骤(ID=1),所以这个ID=1的步骤必须在执行
步骤0之前执行。继续观察ID=1的步骤:
1 0 HASH JOIN (Cost=3 Card=8 Bytes=248)
这个步骤是ID=0的步骤的子步骤,该步骤有2个子步骤:ID=2和ID=3,因此ID=2和
ID=3的步骤必须在ID=1的步骤之前执行。再来检查ID=2的步骤:
2 1 TABLE ACCESS (FULL) OF ‘DEPT’ (Cost=1 Card=3 Bytes=36)
这个步骤是ID=1的步骤的子步骤,并且该步骤没有任何子步骤。因此该步骤是这个
SQL语句第一个执行的步骤,这个步骤产生的结果集会提供给ID=1的步骤。这个步
骤是对表DEPT进行全表扫描,这个步骤的COST=1。
ID=1的步骤也依赖ID=3的步骤:
3 1 TABLE ACCESS (FULL) OF ‘EMP’ (Cost=1 Card=16 Bytes=304)
这个步骤是ID=1的步骤的第二个子步骤,没有任何子步骤,在这个语句中,是第二
个被执行的步骤。
ID=1的步骤将ID=2和ID=3的步骤的结果集进行HASH 连接,然后把结果交给
ID=0的步骤,就完成了本语句的执行。
| ID | 操作 | 名称 | 行数 | 字节 | 代价 |
----------------------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATMENT | | | | |
| 1 | SORT GROUP BY | | | | |
| 2 | MERGE JOIN | | | | |
| 3 | SORT JOIN | | | | |
| 4 | TABLE ACCESS FULL | RESULTS | | | |
| 5 | SORT JOIN | | | | |
| 6 | TABLE ACCESS FULL | WAIT_STATS | | | |
这样看:
从上往下数,数到前面空格最多的,很显然是4 ,(不是第6,因为5比4要少一个空格,不能越界),那么就是说ORACLE是从第4开始,
然后全表扫描results,然后往上做sort join,也就是做第3步
此时发现第3和第5空格数相等,所以不能往上了。 应该做6然后做5.
最后做2-》1-》结果
例如:
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=3 Card=8 Bytes=248)
1 0 HASH JOIN (Cost=3 Card=8 Bytes=248)
2 1 TABLE ACCESS (FULL) OF ‘DEPT’ (Cost=1 Card=3 Bytes=36)
3 1 TABLE ACCESS (FULL) OF ‘EMP’ (Cost=1 Card=16 Bytes=304)
注意这个执行计划的最左边的两个列,第一个列是步骤的ID,第二个列是父步骤的
ID。执行从ID=0的行开始:
0 SELECT STATEMENT ptimizer=CHOOSE (Cost=3 Card=8 Bytes=248)
这个步骤没有父步骤,有一个子步骤(ID=1),所以这个ID=1的步骤必须在执行
步骤0之前执行。继续观察ID=1的步骤:
1 0 HASH JOIN (Cost=3 Card=8 Bytes=248)
这个步骤是ID=0的步骤的子步骤,该步骤有2个子步骤:ID=2和ID=3,因此ID=2和
ID=3的步骤必须在ID=1的步骤之前执行。再来检查ID=2的步骤:
2 1 TABLE ACCESS (FULL) OF ‘DEPT’ (Cost=1 Card=3 Bytes=36)
这个步骤是ID=1的步骤的子步骤,并且该步骤没有任何子步骤。因此该步骤是这个
SQL语句第一个执行的步骤,这个步骤产生的结果集会提供给ID=1的步骤。这个步
骤是对表DEPT进行全表扫描,这个步骤的COST=1。
ID=1的步骤也依赖ID=3的步骤:
3 1 TABLE ACCESS (FULL) OF ‘EMP’ (Cost=1 Card=16 Bytes=304)
这个步骤是ID=1的步骤的第二个子步骤,没有任何子步骤,在这个语句中,是第二
个被执行的步骤。
ID=1的步骤将ID=2和ID=3的步骤的结果集进行HASH 连接,然后把结果交给
ID=0的步骤,就完成了本语句的执行。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/14876437/viewspace-567206/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/14876437/viewspace-567206/