2.1 什么是执行计划
Oracle用来执行目标SQL语句的这些步骤的组合就被称为执行计划。
执行计划可以分为如下三个部分:
1、目标SQL的正文、SQL ID和其执行计划所对应的的PLAN HASH VALUE。
2、执行计划的主体部分。
可以看到Oracle在执行目标SQL时所用的内部执行步骤,这些步骤的执行顺序,所对应的的谓词信息、列信息,优化器评估出来执行这些步骤后返回结果集的Cardinality、成本等内容。
执行计划行前*字符指执行步骤有对应的驱动或者过滤查询条件,这个星号对应的具体的驱动或过滤查询条件可以从执行计划的“Predicate Information(identified y operation id)”中找到。实际上,这部分内饿哦那个就是上述执行步骤所对应的谓词信息。access表示驱动查询条件。
3、执行计划的额外补充信息。
是否使用动态采样(dynamic sampling)
是否使用Cardinality Feedback(Oracle 11g中引入的修正执行计划中返回结果集的Cardinality的一种技术手段)
是否使用SQL Profile(Oracle 10g中引入的调整、稳定执行计划的一种方法)。
2.2 如何查看执行计划
(1)、explain plan命令
按F5,PL/SQL Developer就调用explain plan命令,F5只是explain plan命令上的一层封装而已。
语法:
explain plan for + 目标SQL
select * from table(dbms_xplan.display)
执行explain plan命令,则Oracle就将解析目标SQL所产生的执行计划的具体执行步骤写入PLAN_TABLE$,随后执行的select * from table(dbms_xplan.display)只是从PLAN_TABLE$中将这些具体执行步骤以格式化的方式显示出来。PLAN_TABLE$是一个ON COMMIT PRESERVE ROWS的GLOBAL TEMPORARY TABLE,所以这里Oracle可以做到各个session只能看到自己执行的SQL所产生的执行计划,并且各个session往PLAN_TABLE$写入执行计划的过程互不干扰。
(2)、DBMS_XPLAN包
select * from table(dbms_xplan.display);
select * from table(dbms_xplan.display_cursor(null, null, 'advanced'));
advanced比all显示结果更详细一些。
select * from table(dbms_xplan.display_cursor('sql_id/hash_value', child_cursor_number, 'advanced'));
select * from table(dbms_xplan.display_awr('sql_id'));
(3)、SQLPLUS中的AUTOTRACE开关
SET AUTOTRACE ON(SET AUTOT ON):显示执行结果,执行计划和资源消耗。
SET AUTOTRACE OFF(SET AUTOT OFF):只显示执行结果。
SET AUTOTRACE TRACEONLY:不显示执行结果,与ON区别只显示执行结果的数量,不显示执行结果的具体内容,适合于执行结果的具体内容特别长,刷屏的SQL,这时只关心执行计划和资源消耗量。
SET AUTOTRACE TRACEONLY EXPLAIN(SET AUTOT TRACE EXP):与TRACEONLY区别不显示资源消耗量和执行计划,只显示执行计划。
SET AUTOTTRACE TRACEONLY STATISTICS(SET AUTOT TRACE STAT):只显示资源消耗量,与TRACEONLY区别不显示执行计划,只显示执行结果的数量和资源消耗量。