您的位置:首页 > 数据库 > Oracle

Oracle动态性能表-(10)-V$PROCESS

2009-11-01 17:18 423 查看
 本视图包含当前系统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

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.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';

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

/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: