Oracle执行计划详解 - 极悦
首页 课程 师资 教程 报名

Oracle执行计划详解

  • 2022-05-24 10:09:22
  • 3999次 极悦

定义

执行计划是一条查询语句在Oracle中的执行过程或访问路径的描述。

组成

1.目标 SQL 的正文、sql_id 和执行计划对应的 plan_hash_value

2.执行计划主体,主要有内部执行步骤、执行顺序、谓词信息、列信息、Cardinality、Cost 等

执行计划的额外补充信息,是否动态采用(dynamic sampling)、是否 Cardinality Feedback、是否 SQL Profile

模块解读

主体 Header

 

D:序号

Operation: 当前操作的内容

Rows: 当前操作的 Cardinality,Oracle 估计当前操作的返回结果集。

Cost:SQL 执行的代价

Time:Oracle 估计当前操作的时间

Query Block Name

Query Block Name / Object Alias (identified by operation id):           --这部分显示的为查询块名和对象别名
-------------------------------------------------------------
   1 - SEL$1                                                            --SEL$为select 的缩写,位于块1,相应的还有DEL$,INS$,UPD$等
   3 - SEL$1 / DEPT@SEL$1                                               --DEPT@SEL$1,对应到执行计划中的操作ID为3上,即在表DEPT上的查询,DEPT为别名,下面类同
   4 - SEL$1 / DEPT@SEL$1
   6 - SEL$1 / EMP@SEL$1
   7 - SEL$1 / J@SEL$1

Outline Data

Outline Data                                                            --提纲部分,这部分将执行计划中的图形化方式以文本形式来呈现,即转换为提示符方式
-------------
  /*+
      BEGIN_OUTLINE_DATA
      IGNORE_OPTIM_EMBEDDED_HINTS
      OPTIMIZER_FEATURES_ENABLE('11.2.0.2')
      DB_VERSION('11.2.0.2')
      ALL_ROWS
      OUTLINE_LEAF(@"SEL$1")
      INDEX(@"SEL$1" "DEPT"@"SEL$1" ("DEPT"."DEPTNO"))                  --指明对于DEPT上的访问方式为使用索引
      FULL(@"SEL$1" "EMP"@"SEL$1")                                      --指明对于EMP上的访问方式为全表扫描
      FULL(@"SEL$1" "J"@"SEL$1")
      LEADING(@"SEL$1" "DEPT"@"SEL$1" "EMP"@"SEL$1" "J"@"SEL$1")        --指明前导表
      USE_MERGE(@"SEL$1" "EMP"@"SEL$1")                                 --使用USE_MERGE提示,即MERGE SORT排序合并连接
      USE_HASH(@"SEL$1" "J"@"SEL$1")                                    --使用USE_HASH提示,即HASH连接
      END_OUTLINE_DATA
  */

Predicate Information

 

Access

通过某种方式定位了需要的数据,然后读取出这些结果集,叫做 Access。

表示这个谓词条件的值将会影响数据的访问路劲(表还是索引)。

Filter

把所有的数据都访问了,然后过滤掉不需要的数据,这种方式叫做 filter 。

表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。

Column Projection Information

Column Projection Information (identified by operation id):             --执行时每一步骤所返回的列,下面的不同步骤返回了不同的列
-----------------------------------------------------------
   1 - (#keys=1) "DEPT"."DNAME"[VARCHAR2,14], "EMP"."EMPNO"[NUMBER,22],
       "EMP"."ENAME"[VARCHAR2,10], "J"."JOB_DESCRIBE"[VARCHAR2,100]
   2 - "DEPT"."DNAME"[VARCHAR2,14], "EMP"."EMPNO"[NUMBER,22],
       "EMP"."ENAME"[VARCHAR2,10], "EMP"."JOB"[VARCHAR2,9]
   3 - "DEPT"."DEPTNO"[NUMBER,22], "DEPT"."DNAME"[VARCHAR2,14]
   4 - "DEPT".ROWID[ROWID,10], "DEPT"."DEPTNO"[NUMBER,22]
   5 - (#keys=1) "EMP"."DEPTNO"[NUMBER,22], "EMP"."EMPNO"[NUMBER,22],
       "EMP"."ENAME"[VARCHAR2,10], "EMP"."JOB"[VARCHAR2,9]
   6 - "EMP"."EMPNO"[NUMBER,22], "EMP"."ENAME"[VARCHAR2,10],
       "EMP"."JOB"[VARCHAR2,9], "EMP"."DEPTNO"[NUMBER,22]
   7 - "J"."JOB_NAME"[VARCHAR2,50], "J"."JOB_DESCRIBE"[VARCHAR2,100]

Note

动态采样(dynamic sampling)是 Oracle CBO 优化器的一种特性。如果相关数据表没有收集过统计量,又要使用 CBO 的机制,就会引起动态采样。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交