在DBA诊断方法中,会话的跟踪是比较重要的一个部分。如何获取会话或者某些DML代码的执行计划成为SQL优化重要工具,下面是日常常用3三种跟踪方法,以及一些工具的使用。
1、AUTOTRACE功能
适用:当前会话跟踪,当前屏幕输出。
功能:查看执行查询的运行计划和占用的资源,使用的比较频繁。
SET AUTOTRACE OFF -- 不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN -- AUTOTRACE只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息
SET AUTOTRACE ON -- 包含执行计划和统计信息
SET AUTOTRACE TRACEONLY -- 同set autotrace on,但是不显示查询输出
2、SQL_TRACE(Oracle的辅助诊断工具)
(1)全局使用
在pfile/spfile参数文件中指定: sql_trace =true
SQL> alter system set sql_trace = true;
说明:全局开启SQL_TRACE会导致所有进程被跟踪,包括后台进程及所有用户进程,会导致比较严重的性能问题,所以最好不要开启此功能,默认关闭。
(2)当前会话使用:
SQL> alter session set timed_statistics = true;
SQL> alter session set sql_trace = true;
SQL>执行你的代码
SQL> alter session set sql_trace = false;
SQL> @gettrcname
(3)跟踪其他用户进程:
使用包DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION进行跟踪,
前提是需要手动找到会话的sid,serial#,这个方法就不多陈述了。
SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,true)
SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,false)
SQL> @gettrcname
3、10046事件
10046事件是Oracle提供的内部事件,是对SQL_TRACE的增强.
10046事件可以设置以下四个级别:
1 -- 启用标准的SQL_TRACE功能,等价于sql_trace
4 -- Level 1 + 绑定值(bind values)
8 -- Level 1 + 等待事件跟踪
12 -- Level 1 + Level 4 + Level 8
(1)全局设置。
参数文件中添加:event="10046 trace name context forever,level 12"
(2)对当前session设置。
SQL> alter session set events '10046 trace name context forever';
SQL> alter session set events '10046 trace name context forever, level 8';
SQL>执行你的代码
SQL> alter session set events '10046 trace name context off';
SQL> @gettrcname
(3)对其他用户session设置(调用DBMS_SYSTEM.SET_EV系统包):。
SQL> exec dbms_system.set_ev(sid,serial#,10046,8,'user');
SQL> exec dbms_system.set_ev(sid,serial#,10046,0,'user');
SQL> @gettrcname
4、TKPROF 进行格式化。
跟踪完后使用TKPROF命令进行文件的格式化。
tkprof
5、runstats
tom kyte写的测试工具用于比较代码执行计划的异同。
有兴趣的朋友可以下载代码下来尝试一下。
附:linux下gettrcname代码
SELECT a.VALUE
^X\t"T#b1Ep^#RK24070945 || b.symbol
U Y}I}ja,B1N*qa\G24070945 || c.instance_name ITPUB个人空间r7w!W P K q
|| '_ora_'
Ocg5^ NG)G;QFbZ24070945 || d.spid ITPUB个人空间 a*Az}L
|| '.trc' trace_file ITPUB个人空间(r.H a"@@ {
FROM (SELECT VALUE ITPUB个人空间;dd:]j(L i8e
FROM v$parameter
0gc1b/Ut24070945 WHERE NAME = 'user_dump_dest') a,
1A8T w2y9q24070945 (SELECT SUBSTR (VALUE, -6, 1) symbol ITPUB个人空间H0wV"A/j:bL
FROM v$parameter ITPUB个人空间+DT*Ci)l8J v
WHERE NAME = 'user_dump_dest') b,
N GPa.Q(o24070945 (SELECT instance_name ITPUB个人空间.RnA:S[2cKh
FROM v$instance) c, ITPUB个人空间&Li.y;X M bGoh
(SELECT spid
2j g)a6X#j6_d24070945 FROM v$session s, v$process p, v$mystat m
,j*M,s1i2|y:K+e9K24070945 WHERE s.paddr = p.addr AND s.SID = m.SID AND m.statistic# = 0) d; ITPUB个人空间S,u@U/_M7[!J
1、AUTOTRACE功能
适用:当前会话跟踪,当前屏幕输出。
功能:查看执行查询的运行计划和占用的资源,使用的比较频繁。
SET AUTOTRACE OFF -- 不生成AUTOTRACE 报告,这是缺省模式
SET AUTOTRACE ON EXPLAIN -- AUTOTRACE只显示优化器执行路径报告
SET AUTOTRACE ON STATISTICS -- 只显示执行统计信息
SET AUTOTRACE ON -- 包含执行计划和统计信息
SET AUTOTRACE TRACEONLY -- 同set autotrace on,但是不显示查询输出
2、SQL_TRACE(Oracle的辅助诊断工具)
(1)全局使用
在pfile/spfile参数文件中指定: sql_trace =true
SQL> alter system set sql_trace = true;
说明:全局开启SQL_TRACE会导致所有进程被跟踪,包括后台进程及所有用户进程,会导致比较严重的性能问题,所以最好不要开启此功能,默认关闭。
(2)当前会话使用:
SQL> alter session set timed_statistics = true;
SQL> alter session set sql_trace = true;
SQL>执行你的代码
SQL> alter session set sql_trace = false;
SQL> @gettrcname
(3)跟踪其他用户进程:
使用包DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION进行跟踪,
前提是需要手动找到会话的sid,serial#,这个方法就不多陈述了。
SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,true)
SQL> exec dbms_system.set_sql_trace_in_session(sid,serial#,false)
SQL> @gettrcname
3、10046事件
10046事件是Oracle提供的内部事件,是对SQL_TRACE的增强.
10046事件可以设置以下四个级别:
1 -- 启用标准的SQL_TRACE功能,等价于sql_trace
4 -- Level 1 + 绑定值(bind values)
8 -- Level 1 + 等待事件跟踪
12 -- Level 1 + Level 4 + Level 8
(1)全局设置。
参数文件中添加:event="10046 trace name context forever,level 12"
(2)对当前session设置。
SQL> alter session set events '10046 trace name context forever';
SQL> alter session set events '10046 trace name context forever, level 8';
SQL>执行你的代码
SQL> alter session set events '10046 trace name context off';
SQL> @gettrcname
(3)对其他用户session设置(调用DBMS_SYSTEM.SET_EV系统包):。
SQL> exec dbms_system.set_ev(sid,serial#,10046,8,'user');
SQL> exec dbms_system.set_ev(sid,serial#,10046,0,'user');
SQL> @gettrcname
4、TKPROF 进行格式化。
跟踪完后使用TKPROF命令进行文件的格式化。
tkprof
5、runstats
tom kyte写的测试工具用于比较代码执行计划的异同。
有兴趣的朋友可以下载代码下来尝试一下。
附:linux下gettrcname代码
SELECT a.VALUE
^X\t"T#b1Ep^#RK24070945 || b.symbol
U Y}I}ja,B1N*qa\G24070945 || c.instance_name ITPUB个人空间r7w!W P K q
|| '_ora_'
Ocg5^ NG)G;QFbZ24070945 || d.spid ITPUB个人空间 a*Az}L
|| '.trc' trace_file ITPUB个人空间(r.H a"@@ {
FROM (SELECT VALUE ITPUB个人空间;dd:]j(L i8e
FROM v$parameter
0gc1b/Ut24070945 WHERE NAME = 'user_dump_dest') a,
1A8T w2y9q24070945 (SELECT SUBSTR (VALUE, -6, 1) symbol ITPUB个人空间H0wV"A/j:bL
FROM v$parameter ITPUB个人空间+DT*Ci)l8J v
WHERE NAME = 'user_dump_dest') b,
N GPa.Q(o24070945 (SELECT instance_name ITPUB个人空间.RnA:S[2cKh
FROM v$instance) c, ITPUB个人空间&Li.y;X M bGoh
(SELECT spid
2j g)a6X#j6_d24070945 FROM v$session s, v$process p, v$mystat m
,j*M,s1i2|y:K+e9K24070945 WHERE s.paddr = p.addr AND s.SID = m.SID AND m.statistic# = 0) d; ITPUB个人空间S,u@U/_M7[!J
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24070945/viewspace-702223/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/24070945/viewspace-702223/