若是發現某進程比較消耗資源,但變更頻繁,而且想知道該進程在執行什麼SQL,那麼能夠使用會話跟蹤來找到該進程執行的SQL:sql
跟蹤以前請設置timed_statistics=true及max_dump_file_size=unlimited,根據操做系統進程的SPID找到上述的ORACLE內部會話的sid,serial#,能夠使用以下sql:session
SELECT A.sid,A.Machine,A.Terminal,A.Program FROM V$SESSION A, V$PROCESS B WHERE A.PAddr = B.Addr AND B.spid = '&spid';oracle
執行跟蹤:操作系統
sql> execute dbms_system.set_sql_trace_in_session(sid,serial#,true);debug
而10046事件跟蹤是上述會話跟蹤的加強版本,它比上述的會話跟蹤可以獲得更爲詳細的內容,推薦使用8級進行跟蹤。10046等待事件有1,4,8,12四種等級,8級會記錄等待事件,12級在記錄等待事件的同時還會捕捉綁定變量的值。進程
跟蹤本身所在的進程的方法:事件
sql> alter session set events '10046 trace name context forever, level8';資源
sql> alter session set events '10046 trace name context off';get
跟蹤其餘用戶所在的進程的方法,使用ORACLE級別的session號:it
sql> exec dbms_system.set_ev(sid,serial#,10046,8,'username');
sql> exec dbms_system.set_ev(sid,serial#,10046,0,'username');
或者使用操做系統進程號:
sql> oradebug setospid <SPID>
sql> oradebug unlimit
sql> oradebug event 10046 trace name context forever, level 8
跟蹤本身,也能夠使用:
alter session set sql_trace=true;
另外:
提取sid,serial#的語句,在下面加上serial#便可:
SELECT A.sid,A.Machine,A.Terminal,A.Program FROM V$SESSION A, V$PROCESS B WHERE A.PAddr = B.Addr AND B.spid = '&spid';
爲:
SELECT A.sid,a.serial#, A.Machine,A.Terminal,A.Program FROM V$SESSION A, V$PROCESS B WHERE A.PAddr = B.Addr AND B.spid = '&spid';