当使用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$sessiont,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是如何工作的(内部操作)。
获取跟踪文件sql语句:
selectd.value||'/'||lower(rtrim(i.instance,chr(0)))||'_ora_'||p.spid||'.trc'trace_file_name
from
(selectp.spid
fromsys.v$mystat m,sys.v$session s,sys.v$process p
wherem.statistic#=1 and s.sid = m.sid and p.addr = s.paddr) p,
(selectt.instance from sys.v$thread t,sys.v$parameter v
wherev.name='thread' and (v.value=0 or t.thread#=to_number(v.value))) i,
(selectvalue from sys.v$parameter where name= 'user_dump_dest') d;
获取正在执行的 sql:
selectsql_text from v$sqltext a
wherea.hash_value=(select sql_hash_value
from v$session b
where b.sid='&sid') --sid
orderby piece asc
/