1、生成某个会话跟踪文件
方式1:SQL_trace
一、跟踪其他会话
exec dbms_system.set_SQL_trace_in_session(41,49,true);
exec dbms_system.set_SQL_trace_in_session(7,284,true);
应用执行一段时间后
exec dbms_system.set_SQL_trace_in_session(41,49,false);
exec dbms_system.set_SQL_trace_in_session(7,284,false);
select value from v$diag_info where name='Default Trace File';
二、跟踪当前会话:
alter session set sql_trace=true;
执行具体想要分析的语句
alter session set sql_trace=false;
select value from v$diag_info where name='Default Trace File';
接着
$tkprof trace文件 将跟踪文件转化为标准格式的分析文件。
方式2:10046事件
一、跟踪其他会话:
exec dbms_system.set_ev(16,499,10046,8,'');
exec dbms_system.set_ev(16,499,10046,0,'');
二、跟踪当前会话
SQL> alter session set events '10046 trace name context forever,level 12';
执行具体想要分析的语句
SQL> alter session set events '10046 trace name context off';
2、查看执行过的语句的执行计划(必须要确保你要查询的sql语句还在shared pool中):
select sql_id from v$sql where sql_text='select count(0) from cat_product cp,cat_drug cd where cp.medical_id=cd.id';
select * from table(dbms_xplan.display_cursor('a6hf64s57pz5b',null,'ADVANCED'));
否则需要语句在awr中记录,按照如下语句查找:
select * from table(dbms_xplan.display_awr('a6hf64s57pz5b'));
SELECT * FROM V$sqlarea a WHERE A.SQL_ID='f10pn11qharkx';
3、查看未执行的语句的执行计划:
explain plan for select salary from employees where first_name like 'Pat';
select * from table(dbms_xplan.display);
4、查看正在执行的sql语句的执行计划:
1、设置Autotrace的命令。
分别在执行sql前设置set autotrace 的不同参数,得到不同的观察效果
用法: SET AUTOT[RACE] {OFF | ON | TRACE[ONLY]} [EXP[LAIN]] [STAT[ISTICS]]
--关闭跟踪执行计划和统计信息功能(默认关闭)。
SQL> set autotrace off;
--执行计划和统计信息都显示
SQL> set autotrace on ;
--只显示执行计划和统计信息,不显示sql执行结果。
SQL> set autotrace traceonly;
--只显示执行计划
SQL> set autotrace on explain;
--只显示统计信息
SQL> set autotrace on statistics;
使用autotrace功能时,oracle启用了两个session。
一个用来执行SQL。另一个用来记录执行计划和输出结果。
2、调优常用获取执行计划的方法( gather_plan_statistics ):
SQL> alter session set statistics_level=all;
SQL> select c1, c2, c3 from subquery_t2 t2
where c1 >= 20000
and c1 < 400000
and exists (select /*+ NO_UNNEST */
'X'
FROM SUBQUERY_T1 t1
where t1.c4 = t2.c1);
SQL>select * from table(dbms_xplan.display_cursor(null,null,'allstats last'));
或者下面的方式可省略第一步
select /*+ gather_plan_statistics j1*/ c1, c2, c3
from subquery_t2 t2
where c1 >= 20000
and c1 < 400000
and exists (select /*+ NO_UNNEST */
'X'
FROM SUBQUERY_T1 t1
where t1.c4 = t2.c1);
SELECT SQL_ID,CHILD_NUMBER FROM V$SQL WHERE SQL_TEXT LIKE '%TEST20180122%' AND SQL_TEXT NOT LIKE '%V$SQL%';
select * from table(dbms_xplan.display_cursor('f7m13v249yp85',0,'allstats last'));
3、事件10046 trace跟踪
set autotrace off;
alter session set statistics_level=typical;
alter session set events '10046 trace name context forever,level 12';
执行要分析的sql语句
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 trc文件 目标文件 sys=no sort=prsela,exeela,fchela
4、10053事件
alter session set events '10053 trace name context forever,level 1';
alter session set events '10053 trace name context off';
awrsqrpt.sql 可用来查看某条sql的多个执行计划