Oracle SQL Trace 和 10046 事件


一. SQL_TRACE

SQL语句出现性能问题时,我们可以用SQL_TRACE来跟踪SQL的执行情况,通过跟踪,我们可以了解一条SQL或者PL/SQL包的运行情况,SQL_TRACE命令会将SQL执行的整个过程输出到一个trace文件中,我们可以读这个trace 文件来了解在这个SQL执行过程中Oracle 都做了哪些操作。

 

可以通过sql命令启动SQL_TRACE,或者在初始化参数里面。

 

SQL>alter session set sql_trace=true;

或者

SQL> alter database set sql_trace=true;

 

这两条命令的区别:

session级别设置,只对当前session进行跟踪,在实例级别,会对实例上所有的SQL做跟踪,这种方式跟踪的SQL太多,代价是非常大的,所有很少用。

 

如果是在初始化文件里面设置,只需要在参数文件里添加一个sql_trace 参数即可。

 

 

示例:

 

1.确定当前的trace文件。

 

1.1通过设置trace 文件标识

SQL> alter session set tracefile_identifier='安庆怀宁';

会话已更改。

 

设置标识的目的就是方便我们查找生成的trace文件。我们只需要在trace目录查找文件名里带有标识的文件即可。 Oracle 10g中,SQL_TRACE生成的trace文件默认路劲是$ORACLE_BASE/admin/SID/udump.

到了11gtrace 默认路径在:$ORACLE_BASE/diag/rdbms/orcl/orcl/trace目录下.

 

1.2直接用如下SQL直接查出,当前的trace文件名。

/* Formatted on 2010/9/1 23:56:24 (QP5 v5.115.810.9015) */

SELECTd.VALUE

|| '/'

|| LOWER(RTRIM(i.INSTANCE,CHR(0)))

|| '_ora_'

|| p.spid

|| '.trc'

AS"trace_file_name"

FROM(SELECTp.spid

FROMv$mystat m, v$session s, v$process p

WHEREm.statistic# =1AND s.SID=m.SIDANDp.addr = s.paddr)p,

(SELECTt.INSTANCE

FROMv$thread t, v$parameter v

WHEREv.NAME='thread'

AND(v.VALUE=0ORt.thread# =TO_NUMBER(v.VALUE))) i,

(SELECTVALUE

FROMv$parameter

WHERENAME='user_dump_dest') d;

 

SQL> SELECTd.VALUE

2|| '/'

3|| LOWER (RTRIM (i.INSTANCE, CHR (0)))

4|| '_ora_'

5|| p.spid

6|| '.trc' as "trace_file_name"

7FROM (SELECT p.spid

8FROM v$mystat m, v$session s, v$process p

9WHERE m.statistic# = 1 AND s.SID = m.SID AND p.addr = s.paddr) p,

10(SELECT t.INSTANCE

11FROM v$thread t, v$parameter v

12WHERE v.NAME = 'thread'

13AND (v.VALUE = 0 OR t.thread# = TO_NUMBER (v.VALUE))) i,

14(SELECT VALUE

15FROM v$parameter

16WHERE NAME = 'user_dump_dest') d;

 

trace_file_name

--------------------------------------------------------------------------------

d:/app/administrator/diag/rdbms/orcl/orcl/trace/orcl_ora_3048.trc

 

2.启动SQL_TRACE

SQL> alter session set sql_trace=true;

会话已更改。

 

3.进行相关事务操作

SQL> select * from t;

 

4.关闭SQL_TRACE

SQL> alter session set sql_trace=false;

会话已更改。

 

注意,这里是显示的关闭SQL_TRACE,在session级别,也可以直接退出SQLPLUS来终止SQL_TRACE

  • 1
  • 2
  • 3
  • 下一页

相关内容