(轉)Oracle動態效能檢視學習之v$process

mahanso發表於2010-11-03

本檢視包含當前系統oracle執行的所有程式資訊。常被用於將oracle或服務程式的作業系統程式ID與資料庫session之間建立聯絡。

如果資料庫瓶頸是系統資源(如:cpu,記憶體),並且佔用資源最多的使用者總是停留在某幾個服務程式,那麼進行如下諸項:
找出資源程式;
找出它們的session,你必須將程式與會話聯絡起來;
找出為什麼session佔用瞭如此多的資源。

SQL跟蹤檔名是基於服務程式的作業系統程式ID。要找出session的跟蹤檔案,你必須將session與服務程式聯絡起來。
某些事件,如rdbms ipc reply,鑑別session程式的Oracle程式ID在等什麼。要發現這些程式在做什麼,你必須找出它們的session。
你所看到的伺服器上的後臺程式(DBWR,LGWR,PMON等)都是服務程式。要想知道他們在做什麼,你必須找到他們的session。

V$PROCESS中的常用列
ADDR:程式物件地址
PID:oracle程式ID
SPID:作業系統程式ID

V$PROCESS中的連線列
Column            View                         Joined Column(s)
ADDR              V$SESSION               PADDR

示例:

查詢指定系統使用者在oracle中的session資訊及程式id,假設作業系統使用者為:junsansi
select s.sid,s.SERIAL#, s.username,p.spid
from v$session s, v$process p
where s.osuser = 'junsansi'
   and s.PADDR = p.ADDR

檢視鎖和等待:
SELECT /*+ rule */
lpad(' ', decode(l.xidusn, 0, 3, 0)) || l.oracle_username User_name,
o.owner,o.object_name,o.object_type,s.sid,s.serial#,p.spid
FROM v$locked_object l, dba_objects o, v$session s, v$process p
WHERE l.object_id = o.object_id
   AND l.session_id = s.sid and s.paddr = p.addr
ORDER BY o.object_id, xidusn DESC

附註:

在linux環境可以透過ps檢視程式資訊包括pid,windows中工作管理員的PID與v$process中pid不能一一對應,這塊在oracleDocument中也沒有找到介紹,後來google了一下,有資料介紹說是由於windows是多執行緒伺服器,每個程式包含一系列執行緒。這點於unix等不同,Unix每個Oralce程式獨立存在,在Nt上所有執行緒由Oralce程式衍生。
要在windows中顯示oracle相關程式pid,我們可以透過一個簡單的sql語句來實現。
SELECT s.SID, p.pid, p.spid signaled, s.osuser, s.program
FROM v$process p, v$session s
WHERE p.addr = s.paddr;

還可以透過和 v$bgprocess 連線查詢到後臺程式的名字:
SELECT s.SID SID, p.spid threadid, p.program processname, bg.NAME NAME
FROM v$process p, v$session s, v$bgprocess bg
WHERE p.addr = s.paddr
   AND p.addr = bg.paddr
   AND bg.paddr <> '00';


Eygle大師寫了一段sql指令碼getsql.sql,用來獲取指定pid正在執行的sql語句,在此也附註上來。

REM getsql.sql
REM author eygle
REM 在windows上,已知程式ID,得到當前正在執行的語句
REM 在windows上,程式ID為16進位制,需要轉換,在UNIX直接為10進位制
SELECT   /*+ ORDERED */
         sql_text
    FROM v$sqltext a
   WHERE (a.hash_value, a.address) IN (
            SELECT DECODE (sql_hash_value,
                           0, prev_hash_value,
                           sql_hash_value
                          ),
                   DECODE (sql_hash_value, 0, prev_sql_addr, sql_address)
              FROM v$session b
             WHERE b.paddr = (SELECT addr
                                FROM v$process c
                               WHERE c.spid = TO_NUMBER ('&pid', 'xxxx')))
ORDER BY piece ASC
/

 

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12272958/viewspace-677314/,如需轉載,請註明出處,否則將追究法律責任。

相關文章