oracle 常用有下面7种读取执行计划的方法,图太丑建议复制出来看
序号 | 方法 | 简介 | SQL语句是否真实执行过 | 是否真实执行计划 | 特性 | 物理\逻辑读\递归调用 | 运行时间 | 处理行数 | 表访问次数 | 等待事件 | 解析时间 | |
1 | explain plan | 存储在计划表中的执行计划(默认plan_table) | 否 | 否 | 计划表 | 无 | 无 | 无 | 无 | 无 | 无 | |
2 | set autotrace | SET AUTOTRACE OFF | 此为默认值,即关闭AUTOTRACE | |||||||||
SET AUTOTRACE ON | 包含SQL语句的执行结果、SQL语句执行结果的数量、执行计划和统计信息内容 | 是 | 是 | 有 | 有 | 有 | 无 | 无 | 无 | |||
SET AUTOTRACE ON EXPLAIN | 包含SQL语句的执行结果、SQL语句执行结果的数量和执行计划 | 是 | 无 | 有 | 有 | 无 | 无 | 无 | ||||
SET AUTOTRACE ON STATISTICS | 包含SQL语句的执行结果、SQL语句执行结果的数量和统计信息内容 | 是 | 有 | 有 | 有 | 无 | 无 | 无 | ||||
SET AUTOTRACE TRACEONLY | 包含SQL执行结果的数量、执行计划和统计信息内容,但不显示SQL语句的执行结果 | 是 | 有 | 有 | 有 | 无 | 无 | 无 | ||||
SET AUTOTRACE TRACEONLY EXPLAIN | 同EXPLAIN PLAN命令,对于SELECT语句不会执行,只显示目标SQL的执行计划,但是对于DML语句还是会执行的,而且显示SQL语句执行结果的数量和执行计划 | DQL否,DML是 | 否 | 无 | 有 | 有 | 无 | 无 | 无 | |||
SET AUTOTRACE TRACEONLY STATISTICS | 显示SQL语句执行结果的数量和统计信息,不显示执行计划和SQL执行结果 | DQL否,DML是 | 否 | 有 | 有 | 有 | 无 | 无 | 无 | |||
3 | DBMS_XPLAN | DBMS_XPLAN.DISPLAY | EXPLAIN PLAN FOR SQL语句; SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY); SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY(NULL,NULL,'ADVANCED')); | 否 | 不确定 | 计划表 | 无 | 无 | 无 | 无 | 无 | 无 |
DBMS_XPLAN.DISPLAY_CURSOR('kɜːsə) | ALTER SESSION SET STATISTICS_LEVEL=ALL ; | 是 | 是 | 库存中的游标缓存 | 无 | 有 | 有 | 有 | 无 | 无 | ||
执行SQL SELECT /*+ GATHER_PLAN_STATISTICS*/ … | ||||||||||||
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR(NULL,NULL,'ALLSTATS LAST')); | ||||||||||||
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&SQLID',0,'BASIC LAST ALLSTATS ADVANCED')); | ||||||||||||
DBMS_XPLAN.DISPLAY_CURSOR | 没有设置STATISTICS_LEVEL=ALL或没有使用/*+ GATHER_PLAN_STATISTICS*/的Hint: | 是 | 是 | 无 | 无 | 无 | 无 | 无 | 无 | |||
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_CURSOR('&SQLID')); --从内存得到执行计划 | ||||||||||||
DBMS_XPLAN.DISPLAY_AWR | DISPLAY_AWR函数显示存储在AWR历史数据的执行计划。SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('&SQLID')); | 是 | 是 | AWR仓库基表WRH$SQL_PALN | 无 | 无 | 无 | 无 | 无 | 无 | ||
DBMS_XPLAN.DISPLAY_SQLSET | DISPLAY_SQLSET函数显示存储在一个SQL调优集中的语句的执行计划,SQL调优集查询DBA_SQLSET_STATEMENTS,查询执行计划的SQL语句为:SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_SQLSET('&SQLSET','&SQLID',NULL,'BASIC ALLSTATS ADVANCED')); | 是 | 是 | SQL set视图 | 无 | 无 | 无 | 无 | 无 | 无 | ||
DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE | DISPLAY_SQL_PLAN_BASELINE函数显示存储在数据字典当中SQL执行计划基线的计划。执行计划基线所属SQL的句柄名称(SQL_HANDLE)可以通过视图DBA_SQL_PLAN_BASELINES查询,查询执行计划的SQL语句为:SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_SQL_PLAN_BASELINE(SQL_HANDLE => )); | 是 | 是 | 无 | 无 | 无 | 无 | 无 | 无 | |||
4 | SQL_TRACE、事件10046、10053跟踪 | 1(传统方法)step 1 ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT FOREVER,LEVEL 12'; step 2 执行SQL语句 step 3 ALTER SESSION SET EVENTS '10046 TRACE NAME CONTEXT OFF'; step 4 TKPROF格式化TRACE文件 | 是 | 是 | 有 | 有 | 有 | 无 | 有 | 有 | ||
2 dbms_support 包 | ||||||||||||
3 dbms_monitor包 step 1 dbms_monitor.session_trace_enable(session_id>=123,serial_num=123456,waits=true,binds=false); dbms_monitor.session_trace_disable(session_id>=123,serial_num=123456) | ||||||||||||
5 | awrsqrpt.sql | @?/rdbms/admin/awrsqrpt.sql | 是 | 是 | 有 | 有 | 有 | 无 | 有 | 有 | ||
SELECT OUTPUT FROM TABLE(DBMS_WORKLOAD_REPOSITORY.AWR_SQL_REPORT_HTML(V_DBID,V_INST_ID,V_MIN_SNAP_ID,V_MAX_SNAP_ID,V_SQLID)); | ||||||||||||
6 | SQL实时监控特性:DBMS_SQLTUNE.REPORT_SQL_MONITOR | SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR('&SQLID') FROM DUAL ; | 是 | 是 | 有 | 有 | 有 | 有 | 有 | 有 | ||
SELECT DBMS_SQLTUNE.REPORT_SQL_MONITOR(SQL_ID=>'&SQLID',TYPE=>'ACTIVE',REPORT_LEVEL=>'ALL') AS REPORT FROM DUAL; | ||||||||||||
7 | v$sql、v$sql_plan | select * from v$sql_plan where sql_id='xxxxxxx' | 是 | 是 | 来自数据字典,不是很直观故不太常用 | 1 | 1 | 1 | 1 | 1 | 1 |