什么是执行计划

执行计划是Oracle数据库根据查询语句、表、索引和统计信息等生成的一种执行路线图,它描述了数据库优化器在执行查询语句时的执行步骤和操作方式。执行计划包括了查询的访问方式、连接方式、操作顺序等关键信息。

执行计划示例

组成

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

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

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

模块解读

主体 Header

Header

  • ID:序号
  • Operation: 当前操作的内容
  • Rows: 当前操作的 Cardinality,Oracle 估计当前操作的返回结果集。
  • Cost:SQL 执行的代价
  • Time:Oracle 估计当前操作的时间

Query Block Name

Query Block Name

1
2
3
4
5
6
7
8
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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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

Predicate Information

  • Access
  1. 通过某种方式定位了需要的数据,然后读取出这些结果集,叫做 Access。
  2. 表示这个谓词条件的值将会影响数据的访问路劲(表还是索引)。
  • Filter
  1. 把所有的数据都访问了,然后过滤掉不需要的数据,这种方式叫做 filter 。
  2. 表示谓词条件的值不会影响数据的访问路劲,只起过滤的作用。

Column Projection Information

Column Projection Information

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

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

执行计划的选定依据

在选择执行计划时,数据库优化器会考虑以下几个关键依据:

  1. 统计信息:执行计划的选定依赖于表、索引和列的统计信息。这些统计信息包括表的行数、列的唯一值数目、索引的高度等。通过准确的统计信息,优化器能够评估不同执行计划的成本和效率,并选择最佳的执行路径。
  2. 查询语句和条件:执行计划的选定还考虑了查询语句和条件的影响。优化器会分析查询涉及的表、索引、连接方式以及查询条件的复杂性和选择性。根据这些因素,优化器会评估执行计划的成本和效率,以选择最佳的执行路径。
  3. 系统资源:执行计划的选定还会受到系统资源的限制和优化目标的影响。优化器会考虑系统可用的资源(例如CPU和内存)以及管理员设置的优化目标,以选择适当的执行计划,以平衡查询性能和系统负载。

执行计划在优化数据库查询性能中起着关键的作用。它能够帮助我们理解查询的执行过程、优化查询语句和提高数据库的响应速度。执行计划的选定依据主要包括统计信息、查询语句和条件,以及系统资源的限制和优化目标。通过深入理解和应用执行计划,我们能够更好地优化查询性能,提升数据库的整体效率。