AUTOTRACE功能

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->

当使用oracle AUTOTRACE功能时,在oracle内部实际上启动了两个会话(session)连接,一个session用于执行查询等操作,另一个session用于记录执行计划和输出最终结果等操作。

在启用AUTOTRACE之前:

SQL> select sid,serial#,username from v$session t where t.username is not null;

SID SERIAL# USERNAME

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

125 5 SYS

在启用AUTOTRACE之后:

SQL> set autotrace on;

SQL> select sid,serial#,username from v$session t where t.username is not null;

SID SERIAL# USERNAME

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

125 5 SYS

139 18 SYS

可以看到oracle建立了一个新的session.

并且这两个session由同一个进程创建:

SQL> select t.sid,t.serial#,t.username,t2.pid,t2.spid from v$session t,v$process t2 where t.paddr=t2.addr and t.username is not null;

SID SERIAL# USERNAME PID SPID

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

125 5 SYS 19 1963

139 18 SYS 19 1963

而此处的v$process.spid正是操作系统的进程号:

SQL> !ps -ef|grep 1963|grep -v grep

oracle 1963 1692 0 Apr09 ? 00:00:01 oracleorcl (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

以上可知,一个进程在数据库中可能对应多个session。通过在全局启用10046事件可以得到AUTOTRACE的内部操作。使用TKPROF格式化跟踪文件,查看跟踪文件或格式化后的文件可以查看以上两个session是如何工作的(内部操作)。

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->

获取跟踪文件sql语句:

select d.value||'/'||lower(rtrim(i.instance,chr(0)))||'_ora_'||p.spid||'.trc' trace_file_name

from

(select p.spid

from sys.v$mystat m,sys.v$session s,sys.v$process p

where m.statistic#=1 and s.sid = m.sid and p.addr = s.paddr) p,

(select t.instance from sys.v$thread t,sys.v$parameter v

where v.name='thread' and (v.value=0 or t.thread#=to_number(v.value))) i,

(select value from sys.v$parameter where name= 'user_dump_dest') d;

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->

获取正在执行的 sql

select sql_text from v$sqltext a

where a.hash_value=(select sql_hash_value

from v$session b

where b.sid='&sid') --sid

order by piece asc

/

<!-- @page { margin: 2cm } P { margin-bottom: 0.21cm } -->

来自 : 深入解析Oracle.DBA入门进阶与诊断案例

你可能感兴趣的:(auto)