今天继续上次的说下剩下3个查看执行计划。
4. 10046 trace跟踪 5. awrsqrpt.sql
6. 通过dbms_xplan.display_cursor输入sql_id参数直接获取
第四种:10046 trace跟踪
截图的步骤有点糙了,大家见谅,这里就不具体介绍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
这里就不弄截图了,大家应该都会得。
这里面的统计信息是某个时间段,SQL执行情况的,没有单个SQL的统计信息。
第六种:通过dbms_xplan.display_cursor输入sql_id参数直接获取
dbms_xplan.display_cursor('&sq_id') ---从共享池里得到
dbms_xplan.display_awr('&sq_id')); ---awr性能视图里获取到的
优点: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