從 v$sysstat 視圖中可以找出Session 使用CPU 的情況,例如,可以統計Parse CPU to totalCPU ratio:該項顯示總的CPU 花費在執行及解析上的比率。如果這項比率較低,說明系統執行了太多的解析。

總的 CPU 花費在執行及解析上的比率 = 1 - (parse time cpu / CPU used by this session),可通過以下SQL 語句統計出該項數據。

select 1-(a.value/b.value)

from v$sysstat a,v$sysstat b

where a.name=parse time cpu and

b.name=CPU used by this session;

如果發現CPU 使用比較多,可用以下語句進一步找出使用CPU 多的用戶Session:

select a.sid,spid,status,substr(a.program,1,40)

prog,a.terminal,osuser,value/60/100 value

from v$session a,v$process b,v$sesstat c

where c.statistic#=12

and c.sid=a.sid

and a.paddr=b.addr

order by value desc;

注意:

SQL 語句中的12 是指cpu used by this session。

再進一步找出使用CPU 多的SQL 語句,可查找指定SPID 正在執行的SQL 語句:

SELECT P.pid pid,S.sid sid,P.spid spid,S.username username,S.osuser

osname,P.serial#

S_#,P.terminal,P.program

program,P.background,S.status,RTRIM(SUBSTR(a.sql_text, 1, 80)) SQL

FROM v$process P, v$session S,v$sqlarea A

WHERE P.addr = s.paddr

AND S.sql_address = a.address (+)

AND P.spid LIKE %&1%;

注意:

在Linux 環境中可以通過ps 查看進程信息,包括pid;而Windows 中任務管理器的PID與Oracle 的v$process 中的pid 不能一一對應。Windows 是多線程伺服器,每個進程包含一系列線程,這點與UNIX 等不同,UNIX 每個Oralce 進程獨立存在,在NT 上所有線程由Oralce 進程衍生。

也可以指定SID 查看正在執行的SQL 語句:

也可以指定SID 查看正在執行的SQL 語句:

SELECT P.pid pid,S.sid sid,P.spid spid,S.username username,S.osuser

osname,P.serial#

S_#,P.terminal,P.program

program,P.background,S.status,RTRIM(SUBSTR(a.sql_text, 1, 80)) SQL

FROM v$process P, v$session S,v$sqlarea A

WHERE P.addr = s.paddr

AND S.sql_address = a.address (+)

AND s.sid = 136;


推薦閱讀:
相關文章