现在的位置: 首页 > 综合 > 正文

sqlplus AUTOTRACE功能

2013年09月17日 ⁄ 综合 ⁄ 共 1546字 ⁄ 字号 评论关闭

当使用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

抱歉!评论已关闭.