Oracle 执行计划的获取-2

时间:2022-11-08 07:39:41

      今天继续上次的说下剩下3个查看执行计划。

      4. 10046 trace跟踪          5. awrsqrpt.sql

      6. 通过dbms_xplan.display_cursor输入sql_id参数直接获取


      第四种:10046 trace跟踪

      Oracle 执行计划的获取-2

      截图的步骤有点糙了,大家见谅,这里就不具体介绍10046的使用方法了。

      优点:1.可以看出SQL语句对应的等待事件
                 2.如果SQL语句中有函数调用,SQL中有SQL,将会都被列出,无处遁形。
                 3.可以方便的看出处理的行数,产生的物理逻辑读。
                 4.可以方便的看出解析时间和执行时间。
                 5.可以跟踪整个程序包。存储过程等。

      不足:

                 1.看不到表的访问次数

                 2.看不到谓词

    

    第五种:awrsqrpt.sql

          步骤1:@?/rdbms/admin/awrsqrpt.sql
          步骤2:选择你要的断点(begin snap 和end snap)
          步骤3:输入你的sql_id      

          这里就不弄截图了,大家应该都会得。  

          Oracle 执行计划的获取-2

            这里面的统计信息是某个时间段,SQL执行情况的,没有单个SQL的统计信息。


        

    第六种:通过dbms_xplan.display_cursor输入sql_id参数直接获取

          dbms_xplan.display_cursor('&sq_id') ---从共享池里得到

          dbms_xplan.display_awr('&sq_id'));   ---awr性能视图里获取到的

    Oracle 执行计划的获取-2

    优点:1.查看已经执行过的SQL,不需要再次执行SQL,能保证是实际的执行计划

    不足:1.没有输出运行时的相关统计信息

               2.没有表访问次数,处理多少行。



  应用场景总结:

    1.如果某SQL执行非常长时间才会出结果,甚至慢到返回不了结果,这时候看执行计划就只能用方法(explain plan 

        for);
    2.跟踪某条SQL最简单的方法是方法(explain plan for),其次就是方法(set autotrace on);
    3.如果想观察到某条SQL有多条执行计划的情况,只能用方法(dbms_xplan.display_cursor)和方法(awrsqrpt.sql);
    4.如果SQL中含有多函数,函数中套有SQL等多层递归调用,想准确分析,只能使用方法(10046 trace);
    5.要想确保看到真实的执行计划,不能用方法(explain plan for)和方法(set autotrace on);
    6.要想获取表被访问的次数,只能使用方法(statistics_level=all);


set autotrace off;
alter session set statistics_level=typical;     
alter session set events '10046 trace name context  forever,level 12';

alter session set events '10046 trace name context off';   
select d.value
|| '/'
|| LOWER (RTRIM(i.INSTANCE, CHR(0)))
|| '_ora_'
|| p.spid
|| '.trc' trace_file_name
from (select p.spid
      from v$mystat m,v$session s, v$process p
      where  m.statistic#=1 and s.sid=m.sid and p.addr=s.paddr) p,
      (select t.INSTANCE
       FROM v$thread t,v$parameter v
       WHERE v.name='thread'
       AND(v.VALUE=0 OR t.thread#=to_number(v.value))) i,
       (select value
       from v$parameter
       where name='user_dump_dest') d;
tkprof d:\oracle\diag\rdbms\test11g\test11g\trace/test11g_ora_4824.trc    d:\10046_2.txt  sys=no sort=prsela,exeela,fchela