學習動態性能表linux
第七篇--V$PROCESS 2007.5.30sql
本視圖包含當前系統oracle運行的全部進程信息。常被用於將oracle或服務進程的操做系統進程ID與數據庫session之間創建聯繫。在某些狀況下很是有用:數據庫
V$PROCESS中的經常使用列windows
V$PROCESS中的鏈接列服務器
Column View Joined Column(s) session
ADDR V$SESSION PADDR多線程
示例:oracle
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;
SID |
PID |
SIGNALED |
OSUSER |
PROGRAM |
1 |
2 |
2452 |
SYSTEM |
ORACLE.EXE |
2 |
3 |
2460 |
SYSTEM |
ORACLE.EXE |
3 |
4 |
2472 |
SYSTEM |
ORACLE.EXE |
4 |
5 |
2492 |
SYSTEM |
ORACLE.EXE |
5 |
6 |
2496 |
SYSTEM |
ORACLE.EXE |
6 |
7 |
2508 |
SYSTEM |
ORACLE.EXE |
7 |
8 |
2520 |
SYSTEM |
ORACLE.EXE |
8 |
9 |
2524 |
SYSTEM |
ORACLE.EXE |
10 |
12 |
1316 |
JSS\junsansi |
PlSqlDev.exe |
9 |
13 |
3420 |
JSS\junsansi |
PlSqlDev.exe |
13 |
14 |
660 |
JSS\junsansi |
PlSqlDev.exe |
還能夠經過和 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';
SID |
THREADID |
PROCESSNAME |
NAME |
1 |
2452 |
ORACLE.EXE |
PMON |
2 |
2460 |
ORACLE.EXE |
DBW0 |
3 |
2472 |
ORACLE.EXE |
LGWR |
4 |
2492 |
ORACLE.EXE |
CKPT |
5 |
2496 |
ORACLE.EXE |
SMON |
6 |
2508 |
ORACLE.EXE |
RECO |
7 |
2520 |
ORACLE.EXE |
CJQ0 |
8 |
2524 |
ORACLE.EXE |
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