學習動态性能表
第七篇--V$PROCESS
本視圖包含目前系統oracle運作的所有程序資訊。常被用于将oracle或服務程序的作業系統程序ID與資料庫session之間建立聯系。在某些情況下非常有用:
1. 如果資料庫瓶頸是系統資源(如:cpu,記憶體),并且占用資源最多的使用者總是停留在某幾個服務程序,那麼進行如下諸項:
l 找出資源程序
l 找出它們的session,你必須将程序與會話聯系起來。
l 找出為什麼session占用了如此多的資源
2. SQL跟蹤檔案名是基于服務程序的作業系統程序ID。要找出session的跟蹤檔案,你必須将session與服務程序聯系起來。
3. 某些事件,如rdbms ipc reply,鑒别session程序的Oracle程序ID在等什麼。要發現這些程序在做什麼,你必須找出它們的session。
4. 你所看到的伺服器上的背景程序(DBWR,LGWR,PMON等)都是服務程序。要想知道他們在做什麼,你必須找到他們的session。
V$PROCESS中的常用列
l ADDR:程序對象位址
l PID:oracle程序ID
l SPID:作業系統程序ID
V$PROCESS中的連接配接列
Column View Joined Column(s)
ADDR V$SESSION PADDR
示例:
1. 查找指定系統使用者在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
2. 檢視鎖和等待
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
ORDERBY o.object_id, xidusn DESC
3.
附注:
在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;
SID
PID
SIGNALED
OSUSER
PROGRAM
1
2
2452
SYSTEM
ORACLE.EXE
3
2460
4
2472
5
2492
6
2496
7
2508
8
2520
9
2524
10
12
1316
JSS"junsansi
PlSqlDev.exe
13
3420
14
660
還可以通過和 v$bgprocess 連接配接查詢到背景程序的名字:
SELECT s.SID SID, p.spid threadid, p.program processname, bg.NAMENAME
FROM v$process p, v$session s, v$bgprocess bg
WHERE p.addr = s.paddr
AND p.addr = bg.paddr
AND bg.paddr <> '00';
THREADID
PROCESSNAME
NAME
PMON
DBW0
LGWR
CKPT
SMON
RECO
CJQ0
QMN0
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
/