1. 什么是执行计划
Oracle用来执行目标SQL语句的这些步骤的组合就被称为执行计划。
2. 如何查看执行计划
2.1 explain plan 命令
explain plan 命令的语法是依次执行如下两条命令:
a: explain plan for + 目标SQL
b: select * from table(dbms_xplan.displan);
解释: 如果我们对目标SQL执行explain plan 命令,则Oracle就将目标SQL所产生的具体执行步骤写入PLAN_TABLES$,随后执行的"select * from table(dbms_xplan.display)"只是从PLAN_TABLE$中将这些具体执行步骤以格式化的方式显示出来。
备注: explain plan命令得到的执行计划是不准的,因为此时的SQL并没有执行。
2.2 SQLPLUS中的AUTOTRACE
SQLPLUS中的AUTOTRACE有如何几种语法格式:
a: SET AUTOTRACE ON
完全打开:除了显示SQL执行结果之外,还会额外显示这些SQL所对应的执行计划和资源消耗情况。
b: SET AUTOTRACE OFF
完全关闭
c: SET AUTOTRACE TRACEONLY
显示SQL所对应的执行计划和资源消耗情况,但不显示SQL执行结果。
d: SET AUTOTRACE TRACEONLY EXPLAIN
只显示SQL所对应的执行计划
e: SET AUTOTRACE TRACEONLY STATISTICS
只显示SQL所对应的资源消耗情况
备注: SQLPLUS中的AUTOTRACE得到的执行计划也是不准确的。
2.3:GATHER_PLAN_STATISTICS HINT
语法例子:
select /*+ gather_plan_statistics */ t1.col1,t1.col2,t2.col3 from t1,t2 where t1.col2=t2.col2;
select * from table(dbms_xplan.display_cursor(format => 'allstats last'));
备注1:E_ROWS : 期待返回的行数
A_ROWS: 实际返回的行数
备注2:用gather_plan_statistics Hint得到的执行计划是准确的
3:如何查看执行计划的执行顺序
先从最开头一直连续往右看,直到看到最右边的并列的地方;对应不并列的,靠右的先执行;如果见到并列的,就从上往下看,对于并列的部分,靠上的先执行。
或者这样理解:先从最开头一直连续往右看,直到看到 no child ,如果一个parent有多个children,此时每个child肯定是并列的,在最上面的child先执行,然后一层层剥开即可。