學習動態性能表(7)--v$process

學習動態性能表linux

第七篇--V$PROCESS  2007.5.30sql

 

  本視圖包含當前系統oracle運行的全部進程信息。常被用於將oracle或服務進程的操做系統進程ID與數據庫session之間創建聯繫。在某些狀況下很是有用:數據庫

 

  1. 若是數據庫瓶頸是系統資源(如:cpu,內存),而且佔用資源最多的用戶老是停留在某幾個服務進程,那麼進行以下諸項:

 

  • 找出資源進程
  • 找出它們的session,你必須將進程與會話聯繫起來。
  • 找出爲何session佔用瞭如此多的資源

 

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

 

V$PROCESS中的經常使用列windows

  • ADDR:進程對象地址
  • PID:oracle進程ID
  • SPID:操做系統進程ID

 

V$PROCESS中的鏈接列服務器

Column                       View                            Joined Column(s) session

ADDR                         V$SESSION                PADDR多線程

 

 

示例:oracle

  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

 

  1. 查看鎖和等待

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

 

  1.  

 

 

附註:

  在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

相關文章
相關標籤/搜索