Welcome 微信登录

首页 / 数据库 / MySQL / Oracle执行计划 讲解(二)

现在我们讲讲Oracle执行计划里面每个参数的含义我们以下面的一个例子来讲解这里做个补充:trace的类型一共有以下几种
序号命令解释
1SET AUTOTRACE OFF此为默认值,即关闭Autotrace 
2SET AUTOTRACE ON EXPLAIN只显示执行计划
3SET AUTOTRACE ON STATISTICS 只显示执行的统计信息
4SET AUTOTRACE ON 包含2,3两项内容
5SET AUTOTRACE TRACEONLY 与ON相似,但不显示语句的执行结果
 我喜欢SET AUTOTRACE TRACEONLY,我们以后的例子都是基于这种方式的
  1. SQL> select * from departments a where a.department_id in (select b.department_id from employees b where b.employee_id=205);  
  2.   
  3.   
  4. Execution Plan  
  5. ----------------------------------------------------------   
  6. Plan hash value: 2782876085  
  7.   
  8. ----------------------------------------------------------------------------------------------   
  9. | Id  | Operation                    | Name          | Rows  | Bytes | Cost (%CPU)| Time     |  
  10. ----------------------------------------------------------------------------------------------   
  11. |   0 | SELECT STATEMENT             |               |     1 |    27 |     2   (0)| 00:00:01 |  
  12. |   1 |  NESTED LOOPS                |               |     1 |    27 |     2   (0)| 00:00:01 |  
  13. |   2 |   TABLE ACCESS BY INDEX ROWID| EMPLOYEES     |     1 |     7 |     1   (0)| 00:00:01 |  
  14. |*  3 |    INDEX UNIQUE SCAN         | EMP_EMP_ID_PK |     1 |       |     0   (0)| 00:00:01 |  
  15. |   4 |   TABLE ACCESS BY INDEX ROWID| DEPARTMENTS   |    27 |   540 |     1   (0)| 00:00:01 |  
  16. |*  5 |    INDEX UNIQUE SCAN         | DEPT_ID_PK    |     1 |       |     0   (0)| 00:00:01 |  
  17. ----------------------------------------------------------------------------------------------   
  18.   
  19. Predicate Information (identified by operation id):  
  20. ---------------------------------------------------   
  21.   
  22.    3 - access("B"."EMPLOYEE_ID"=205)  
  23.    5 - access("A"."DEPARTMENT_ID"="B"."DEPARTMENT_ID")  
  24.   
  25.   
  26. Statistics  
  27. ----------------------------------------------------------   
  28.           1  recursive calls  
  29.           0  db block gets  
  30.           4  consistent gets  
  31.           0  physical reads  
  32.           0  redo size  
  33.         749  bytes sent via SQL*Net to client  
  34.         492  bytes received via SQL*Net from client  
  35.           2  SQL*Net roundtrips to/from client  
  36.           0  sorts (memory)  
  37.           0  sorts (disk)  
  38.           1  rows processed  
  39.    
让我们来一行一行的看: 一、表部分
1、Plan hash value:
  1. Plan hash value: 2782876085  
这一行是这一条语句的hash值,我们知道oracle对每条语句产生的执行计划放在share pool里面,第一次要经过硬解析,产生hash值。下次再执行该语句时候比较hash值,如果相同就不要执行硬解析。 2、Operation( 操作)这里的东西就多了,就是把sql进行分解,让我一起看看上的sql,这段sql的第一步是employee_id=25,这里我们employee_id上面建了主键,建主键默认创建唯一索引。这里是用“=”进行限制的,所以走的unique scan方式。其他方式参考Oracle执行计划 讲解(一)内容 还有一个知识点,就是要知道表链接操作,见我的另外一篇文章()
3、Name(被操作的对象)比如上例中的第二行operation(TABLE ACCESS BY INDEX ROWID)这里的TABLE对象为EMPLOYEES4、Row,有的地方也叫Cardinality(用plsqldev里面解释计划窗口)这里是数据查询的行数,比如说上个例子第4行,  departments 这张表就要扫描27行,然后和子查询(select b.department_id from employees b where b.employee_id=205)的值进行比较。如果使用=(注:大部分时候是不能用=来替换,这里是特例)就不一样了。
  1. SQL> select * from departments a where a.department_id = (select b.department_id from employees b where b.employee_id=205);  
  2.   
  3.   
  4. Execution Plan  
  5. ----------------------------------------------------------   
  6. Plan hash value: 3449260133  
  7.   
  8. -----------------------------------------------------------------------------------------------   
  9. | Id  | Operation                     | Name          | Rows  | Bytes | Cost (%CPU)| Time     |  
  10. -----------------------------------------------------------------------------------------------   
  11. |   0 | SELECT STATEMENT              |               |     1 |    20 |     2   (0)| 00:00:01 |  
  12. |   1 |  TABLE ACCESS BY INDEX ROWID  | DEPARTMENTS   |     1 |    20 |     1   (0)| 00:00:01 |  
  13. |*  2 |   INDEX UNIQUE SCAN           | DEPT_ID_PK    |     1 |       |     0   (0)| 00:00:01 |  
  14. |   3 |    TABLE ACCESS BY INDEX ROWID| EMPLOYEES     |     1 |     7 |     1   (0)| 00:00:01 |  
  15. |*  4 |     INDEX UNIQUE SCAN         | EMP_EMP_ID_PK |     1 |       |     0   (0)| 00:00:01 |  
  16. -----------------------------------------------------------------------------------------------   
  17.   
  18. Predicate Information (identified by operation id):  
  19. ---------------------------------------------------   
  20.   
  21.    2 - access("A"."DEPARTMENT_ID"= (SELECT /*+ */ "B"."DEPARTMENT_ID" FROM "EMPLOYEES"  
  22.               "B" WHERE "B"."EMPLOYEE_ID"=205))  
  23.    4 - access("B"."EMPLOYEE_ID"=205)  
  24.   
  25.   
  26. Statistics  
  27. ----------------------------------------------------------   
  28.           0  recursive calls  
  29.           0  db block gets  
  30.           4  consistent gets  
  31.           0  physical reads  
  32.           0  redo size  
  33.         749  bytes sent via SQL*Net to client  
  34.         492  bytes received via SQL*Net from client  
  35.           2  SQL*Net roundtrips to/from client  
  36.           0  sorts (memory)  
  37.           0  sorts (disk)  
  38.           1  rows processed  
  39.    
5、Byte扫描的数据的字节数6、Cost这里上次讲过了,这里简单说下吧。cost没有单位,是一个相对值,是sql文以cbo方式解析执行时,供oracle用来评估cbo成本,选择执行计划用的。公式:Cost=(Single block I/O cost+ Multiblock I/O cost+   CPU cost)/sreadtim没有明确的含义,不过对比时就非常有用了。7、Time每段执行的时间
  • 1
  • 2
  • 3
  • 下一页
Oracle执行计划 讲解(一)创建hr用户和表相关资讯      Oracle基础教程 
  • Oracle块编程返回结果集详解  (11/10/2013 10:45:58)
  • Oracle基础教程之设置系统全局区  (08/22/2013 14:24:00)
  • Oracle基础教程知识点总结  (06/18/2013 07:43:32)
  • Oracle基础教程之tkprof程序详解  (10/22/2013 11:49:50)
  • Oracle基础教程之sqlplus汉字乱码  (07/18/2013 16:30:00)
  • Oracle 管理之 Linux 网络基础  (02/16/2013 18:37:35)
本文评论 查看全部评论 (0)
表情: 姓名: 字数