天天看點

學習動态性能表 第七篇--V$PROCESS

學習動态性能表

第七篇--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

/