以下是对Oracle中获取执行计划的几种方法进行了详细的分析介绍
需要的朋友可以参考下
预估执行计划 Explain Plan
Explain plan以SQL语句作为输入得到这条SQL语句的执行计划并将执行计划输出存储到计划表中
首先在你要执行的SQL语句前加explain plan for此时将生成的执行计划存储到计划表中语句如下
explain plan for SQL语句
然后在计划表中查询刚刚生成的执行计划语句如下
select * from table(dbms_xplandisplay);
注意Explain plan只生成执行计划并不会真正执行SQL语句因此产生的执行计划有可能不准因为
)当前的环境可能和执行计划生成时的环境不同
)不会考虑绑定变量的数据类型
)不进行变量窥视
查询内存中缓存的执行计划 (dbms_xplandisplay_cursor)
如果你想获取正在执行的或刚执行结束的SQL语句真实的执行计划(即获取library cache中的执行计划)可以到动态性能视图里查询方法如下
)获取SQL语句的游标
游标分为父游标和子游标父游标由sql_id(或联合address和hash_value)字段表示子游标由child_number字段表示
如果SQL语句正在运行可以从v$session中获得它的游标信息如
select status sql_id sql_child_number from v$session where status=ACTIVE and
如果知道SQL语句包含某些关键字可以从v$sql视图中获得它的游标信息如
select sql_id child_number sql_text from v$sql where sql_text like %关键字%‘
)获取库缓存中的执行计划
为了获取缓存库中的执行计划可以直接查询动态性能视图v$sql_plan和v$sql_plan_statistics_all等但更方便的方法是以sql_id和子游标为参数执行如下语句
select * from table(dbms_xplandisplay_cursor(sql_idchild_number));
)获取前一次的执行计划
set serveroutput off
select * from table(dbms_xplandisplay_cursor(nullnullALLSTATS LAST));
查询历史执行计划(dbms_xplandisplay_awr)
AWR会定时把动态性能视图中的执行计划保存到dba_hist_sql_plan视图中如果你想要查看历史执行计划可以采用如下方法查询
select * from table(dbms_xplandisplay_awr(sql_id);
在用sqlplus做SQL开发是(Autotrace)
set autotrace是sqlplus工具的一个功能只能在通过sqlplus连接的session中使用它非常适合在开发时测试SQL语句的性能有以下几种参数可供选择
SET AUTOTRACE OFF 不显示执行计划和统计信息这是缺省模式
SET AUTOTRACE ON EXPLAIN 只显示优化器执行计划
SET AUTOTRACE ON STATISTICS 只显示统计信息
SET AUTOTRACE ON 执行计划和统计信息同时显示
SET AUTOTRACE TRACEONLY 不真正执行只显示预期的执行计划同explain plan
生成Trace文件查询详细的执行计划 (SQL_Trace )
SQL_TRACE 作为初始化参数可以在实例级别启用也可以只在会话级别启用在实例级别启用SQL_TRACE会导致所有进程的活动被跟蹤包括后台进程及所有用户进 程这通常会导致比较严重的性能问题所以在一般情况下我们使用sql_trace跟蹤当前进程方法如下
SQL>alter session set sql_trace=true;
被跟蹤的SQL语句
SQL>alter session set sql_trace=false;
如果要跟蹤其它进程可以通过Oracle提供的系统包DBMS_SYSTEM SET_SQL_TRACE_IN_SESSION来实现例如
SQL> exec dbms_systemset_sql_trace_in_session(sidserial#true) 开始跟蹤
SQL> exec dbms_systemset_sql_trace_in_session(sidserial#false) 结束跟蹤
生成trace文件后再用tkprof 工具将sql trace 生成的跟蹤文件转换成易读的格式语法如下
tkprof inputfile outputfile
事件是SQL_TRACE的一个升级版它也是追蹤会话生成Trace文件只是它里面的内容更详细