ITPub博客

首页 > 数据库 > Oracle > 获得目标SQL语句执行计划的方法

获得目标SQL语句执行计划的方法

原创 Oracle 作者:db_wjw 时间:2014-12-10 13:25:56 0 删除 编辑
Oracle用来执行目标SQL语句的一系列步骤的组合被称为执行计划。
得到目标SQL执行计划的方法:

1、explain plan命令
explain plan for select ename,sal from emp;
select * from table(dbms_xplan.display);

2、dbms_xplan包
(1)select * from table(dbms_xplan.display); /*需要与explain plan for命令配合使用*/
(2)select empno,ename,dname from emp,dept where emp.deptno=dept.deptno;
     select * from table(dbms_xplan.display_cursor(null,null,'advanced'));
     第三个参数可以是advanced,也可以是all,all与advanced比,输出的结果少了outline data部分的内容
(3)只要目标SQL的执行计划所在的child cursor还没有被age out出Shared Pool,就可以是用该种方法来查看执行计划
     select sql_text,sql_id,hash_value,child_number from v$sql where sql_text like 'select empno,ename,dname%';
     select * from table(dbms_xplan.display_cursor('sql_id/hash_value',child_cursor_number,'advanced'));
     第一个参数为SQL的SQL ID或者SQL hash value,第二个参数为要查看的执行计划所在的child cursor number,第三个参数为advanced或者all
举例:
SQL> select sql_text,sql_id,hash_value,child_number from v$sql where sql_text like 'select empno,ename,dname%';
SQL_TEXT           SQL_ID         HASH_VALUE CHILD_NUMBER
---------------------------------------------------------------------- ------------- ---------- ------------
select empno,ename,dname from emp,dept where emp.deptno=dept.deptno    7ww0fhpbqqt0n 1466655764   0
select * from table(dbms_xplan.display_cursor('7ww0fhpbqqt0n',0,'advanced'));
(4)select * from table(dbms_xplan.display_awr('sql_id'));
只要SQL的执行计划被Oracle采集到AWR repository中,不管现在执行计划是不是还在Shard Pool中,都可以是用改语句查看SQL的所有历史执行计划。

3、autotrace开关
set autotrace on                       /*显示SQL执行结果、对应的执行计划和资源消耗情况*/
set autotrace off                      /*只会显示SQL执行结果,为autotrace开关的默认值*/
set autotrace traceonly                /*显示执行计划和资源消耗情况*/
set autotrace traceonly explain        /*只显示执行计划*/
set autotrace traceonly statistics     /*只显示资源消耗情况*/

4、10046事件与tkprof命令
这种方法所得到的执行计划比前三种方法好的地方在于:明确显示了目标SQL实际执行过程中每一个执行步骤所消耗的逻辑读、物理读和所花费的时间。这种细粒度的显示对我们诊断复杂的SQL性能问题时特别有用。
用该种方法得到执行计划的步骤:
(1)在当前session中激活10046事件:
alter session set events '10046 trace name context forever,level 12';
或者
oradebug event 10046 trace name context forever,level 12;
/*推荐使用第二种方法,可以是用oradebug tracefile_name来得到当前session所对应的trace文件的路径和名称*/
(2)在session中执行目标SQL
(3)在当前session中关闭10046事件
alter session set events '10046 trace name context off';
或者
oradebug event 10046 trace name context off;

举例说明:
SQL> conn / as sysdba;
SQL> oradebug setmypid
Statement processed.
/*一定要有此步骤,要不会有ORA-00074: no process has been specified错误*/
SQL> oradebug event 10046 trace name context forever,level 12;
Statement processed.
SQL> select empno,ename,dname from scott.emp,scott.dept where emp.deptno=dept.deptno;
SQL> oradebug tracefile_name
/u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_29480.trc
SQL> oradebug event 10046 trace name context off
$ tkprof /u01/app/oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_29480.trc /tmp/wjw_trace.txt

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26194851/viewspace-1363145/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-08-21

  • 博文量
    96
  • 访问量
    506459