ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 执行计划分析

执行计划分析

原创 Linux操作系统 作者:zwc1083 时间:2009-03-13 16:31:46 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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-02-16

  • 博文量
    91
  • 访问量
    43561