<!-- @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入门进阶与诊断案例