一. 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.
到了11g,trace 默认路径在:$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。