(轉):學習Oracle動態效能表-(12)-V$PROCESS

xz43發表於2010-11-16

V$PROCESS

  本檢視包含當前系統執行的所有程式資訊。常被用於將oracle或服務程式的程式IDsession之間建立聯絡。在某些情況下非常有用:

1.        如果資料庫瓶頸是系統資源(如:cpu,記憶體),並且佔用資源最多的使用者總是停留在某幾個服務程式,那麼進行如下諸項:

l        找出資源程式

l        找出它們的session,你必須將程式與會話聯絡起來。

l        找出為什麼session佔用瞭如此多的資源

2.        跟蹤檔名是基於服務程式的作業系統程式ID。要找出session的跟蹤檔案,你必須將session與服務程式聯絡起來。

3.        某些事件,如rdbms ipc reply,鑑別session程式的Oracle程式ID在等什麼。要發現這些程式在做什麼,你必須找出它們的session

4.        你所看到的伺服器上的後臺程式(DBWR,LGWR,PMON)都是服務程式。要想知道他們在做什麼,你必須找到他們的session

V$PROCESS中的常用列

l        ADDR:程式物件地址

l        PIDoracle程式ID

l        SPID:作業系統程式ID

V$PROCESS中的連線列

Column                       View                            Joined Column(s)

ADDR                          V$SESSION                 PADDR

示例:

1.        查詢指定系統使用者在oracle中的session資訊及程式id,假設作業系統使用者為:junsansi

selects.sid,s.SERIAL#, s.username,p.spid

fromv$session s, v$process p

wheres.osuser ='junsansi'

  ands.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

FROMv$locked_object l, dba_objects o, v$session s, v$process p

WHEREl.object_id = o.object_id

  ANDl.session_id = s.sidands.paddr = p.addr

ORDERBYo.object_id, xidusnDESC

3.        

附註:

  在linux環境可以透過ps檢視程式資訊包括pid,windows中工作管理員的PIDv$processpid不能一一對應,這塊在oracleDocument中也沒有找到介紹,後來google了一下,有資料介紹說是由於windows是多執行緒伺服器,每個程式包含一系列執行緒。這點於unix等不同,Unix每個Oralce程式獨立存在,在Nt上所有執行緒由Oralce程式衍生。

  要在windows中顯示oracle相關程式pid,我們可以透過一個簡單的sql語句來實現。

SELECTs.SID, p.pid, p.spid signaled, s.osuser, s.program

FROMv$process p, v$session s

WHEREp.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連線查詢到後臺程式的名字:

SELECTs.SID SID, p.spid threadid, p.program processname, bg.NAMENAME

FROMv$process p, v$session s, v$bgprocess bg

WHEREp.addr = s.paddr

  ANDp.addr = bg.paddr

  ANDbg.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大師寫了一段指令碼getsql.sql,用來獲取指定pid正在執行的sql語句,在此也附註上來。

REM getsql.sql

REM author eygle

REM,已知程式ID,得到當前正在執行的語句

REMwindows,程式ID16進位制,需要轉換,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/9399028/viewspace-678261/,如需轉載,請註明出處,否則將追究法律責任。

相關文章