ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 学习动态性能表(2)--V$PROCESS

学习动态性能表(2)--V$PROCESS

原创 Linux操作系统 作者:zwc1083 时间:2009-02-25 15:35:33 0 删除 编辑

学习动态性能表(三)-(2)-V$SQL_PLAN2007年10月31日 星期三 12:57本视图提供了一种方式检查那些执行过的并且仍在缓存中的cursor的执行计划。
  通常,本视图提供的信息与打印出的EXPLAIN PLAN非常相似,不过,EXPLAIN PLAN显示的是理论上的计划,并不一定在执行的时候就会被使用,但V$SQL_PLAN中包括的是实际被使用的计划。获自EXPLAIN PLAN语句的执行计划跟具体执行的计划可以不同,因为cursor可能被不同的session参数值编译(如,HASH_AREA_SIZE)。
V$SQL_PLAN中数据可以:  确认当前的执行计划
  鉴别创建表索引效果
  寻找cursor包括的存取路径(例如,全表查询或范围索引查询)
  鉴别索引的选择是否最优
  决定是否最优化选择的详细执行计划(如,nested loops join)如开发者所愿。

  本视图同时也可被用于当成一种关键机制在计划对比中。计划对比通常用于下列各项发生改变时:

  删除和新建索引
  在数据库对象上执行分析语句
  修改初始参数值
  从rule-based切换至cost-based优化方式
  升级应用程序或数据库到新版本之后

  如果之前的计划仍然在(例如,从V$SQL_PLAN选择出记录并保存到oracle表中供参考),那么就有可能去鉴别一条SQL语句在执行计划改变后性能方面有什么变化。

注意:
Oracle公司强烈推荐你使用DBMS_STATS包而非ANALYZE收集优化统计。该包可以让你平行地搜集统计项,收集分区对象(partitioned objects)的全集统计,并且通过其它方式更好的调整你的统计收集方式。此处,cost-based优化器将最终使用被DBMS_STATS收集的统计项。浏览Oracle9i Supplied PL/SQL包和类型参考以获得关于此包的更多信息。

不过,你必须使用ANALYZE语句而非DBMS_STATS进行统计收集,不涉及cost-based优化器,就像:
·使用VALIDATE或LIST CHAINED ROWS子句
·在freelist blocks上收集信息。

V$SQL_PLAN中的常用列:

除了一些新加列,本视图几乎包括所有的PLAN_TABLE列,那些同样存在于PLAN_TABLE中的列拥有相同的值:
ADDRESS:当前cursor父句柄位置
HASH_VALUE:在library cache中父语句的HASH值。
ADDRESS和HASH_VALUE这两列可以被用于连接v$sqlarea查询 cursor-specific 信息。
CHILD_NUMBER:使用这个执行计划的子cursor数
列ADDRESS,HASH_VALUE以及CHILD_NUMBER可被用于连接v$sql查询子cursor信息。
OPERATION: 在各步骤执行内部操作的名称,例如:TABLE ACCESS
OPTIONS: 描述列OPERATION在操作上的变种,例如:FULL
OBJECT_NODE: 用于访问对象的数据库链接database link 的名称对于使用并行执行的本地查询该列能够描述操作中输出的次序。
OBJECT#: 表或索引对象数量
OBJECT_OWNER: 对于包含有表或索引的架构schema 给出其所有者的名称
OBJECT_NAME: 表或索引名
OPTIMIZER: 执行计划中首列的默认优化模式;例如,CHOOSE。比如业务是个存储数据库,它将告知是否对象是最优化的。
ID: 在执行计划中分派到每一步的序号。
PARENT_ID: 对ID 步骤的输出进行操作的下一个执行步骤的ID。
DEPTH: 业务树深度(或级)。
POSITION: 对于具有相同PARENT_ID 的操作其相应的处理次序。
COST: cost-based方式优化的操作开销的评估,如果语句使用rule-based方式,本列将为空。
CARDINALITY: 根据cost-based方式操作所访问的行数的评估。
BYTES: 根据cost-based方式操作产生的字节的评估,。
OTHER_TAG: 其它列的内容说明。
PARTITION_START: 范围存取分区中的开始分区。
PARTITION_STOP: 范围存取分区中的停止分区。
PARTITION_ID: 计算PARTITION_START和PARTITION_STOP这对列值的步数
OTHER: 其它信息即执行步骤细节,供用户参考。
DISTRIBUTION: 为了并行查询,存储用于从生产服务器到消费服务器分配列的方法
CPU_COST: 根据cost-based方式CPU操作开销的评估。如果语句使用rule-based方式,本列为空。
IO_COST: 根据cost-based方式I/O操作开销的评估。如果语句使用rule-based方式,本列为空。
TEMP_SPACE: cost-based方式操作(sort or hash-join)的临时空间占用评估。如果语句使用rule-based方式,本列为空。
ACCESS_PREDICATES: 指明以便在存取结构中定位列,例如,在范围索引查询中的开始或者结束位置。
FILTER_PREDICATES: 在生成数据之前即指明过滤列。

CONNECT BY操作产生DEPTH列替换LEVEL伪列,有时被用于在SQL脚本中帮助indent PLAN_TABLE数据

V$SQL_PLAN中的连接列
  列ADDRESS,HASH_VALUE和CHILD_NUMBER被用于连接V$SQL或V$SQLAREA来获取cursor-specific信息,例如,BUFFER_GET,或连接V$SQLTEXT获取完整的SQL语句。
Column View Joined Column(s)
ADDRESS, HASH_VALUE V$SQLAREA ADDRESS, HASH_VALUE
ADDRESS,HASH_VALUE,CHILD_NUMBER V$SQL ADDRESS,HASH_VALUE,CHILD_NUMBER
ADDRESS, HASH_VALUE V$SQLTEXT ADDRESS, HASH_VALUE


确认SQL语句的优化计划
  下列语句显示一条指定SQL语句的执行计划。查看一条SQL语句的执行计划是调整优化SQL语句的第一步。这条被查询到执行计划的SQL语句是通过语句的HASH_VALUE和ADDRESS列识别。分两步执行:

1.SELECT sql_text, address, hash_value FROM v$sql
WHERE sql_text like '%TAG%';

SQL_TEXT ADDRESS HASH_VALUE
-------- -------- ----------
82157784 1224822469


2.SELECT operation, options, object_name, cost FROM v$sql_plan
WHERE address = '82157784' AND hash_value = 1224822469;

OPERATION OPTIONS OBJECT_NAME COST
-------------------- ------------- ------------------ ----
SELECT STATEMENT 5
SORT
AGGREGATE
HASH JOIN 5
TABLE ACCESS FULL DEPARTMENTS 2
TABLE ACCESS FULL EMPLOYEES 2
 
学习动态性能表第四篇-(1)-V$SQLTEXT2007年10月31日 星期三 13:38本视图包括Shared pool中SQL语句的完整文本,一条SQL语句可能分成多个块被保存于多个记录内。
  注:V$SQLAREA只包括头1000个字符。
V$SQLTEXT中的常用列

HASH_VALUE:SQL语句的Hash值
ADDRESS:sql语句在SGA中的地址
SQL_TEXT:SQL文本。
PIECE:SQL语句块的序号

V$SQLTEXT中的连接列
Column View Joined Column(s)
HASH_VALUE, ADDRESS V$SQL, V$SESSION HASH_VALUE, ADDRESS
HASH_VALUE. ADDRESS V$SESSION SQL_HASH_VALUE, SQL_ADDRESS

示例:已知hash_value:3111103299,查询sql语句:
select * from v$sqltext
where hash_value='3111103299'
order by piece
 
学习动态性能表第四篇-(2)-V$SQLAREA2007年10月31日 星期三 13:38本视图持续跟踪所有shared pool中的共享cursor,在shared pool中的每一条SQL语句都对应一列。本视图在分析SQL语句资源使用方面非常重要。
V$SQLAREA中的信息列

HASH_VALUE:SQL语句的Hash值。
ADDRESS:SQL语句在SGA中的地址。
这两列被用于鉴别SQL语句,有时,两条不同的语句可能hash值相同。这时候,必须连同ADDRESS一同使用来确认SQL语句。
PARSING_USER_ID:为语句解析第一条CURSOR的用户
VERSION_COUNT:语句cursor的数量
KEPT_VERSIONS:
SHARABLE_MEMORY:cursor使用的共享内存总数
PERSISTENT_MEMORY:cursor使用的常驻内存总数
RUNTIME_MEMORY:cursor使用的运行时内存总数。
SQL_TEXT:SQL语句的文本(最大只能保存该语句的前1000个字符)。
MODULE,ACTION:使用了DBMS_APPLICATION_INFO时session解析第一条cursor时的信息

V$SQLAREA中的其它常用列

SORTS: 语句的排序数
CPU_TIME: 语句被解析和执行的CPU时间
ELAPSED_TIME: 语句被解析和执行的共用时间
PARSE_CALLS: 语句的解析调用(软、硬)次数
EXECUTIONS: 语句的执行次数
INVALIDATIONS: 语句的cursor失效次数
LOADS: 语句载入(载出)数量
ROWS_PROCESSED: 语句返回的列总数

V$SQLAREA中的连接列Column View Joined Column(s)
HASH_VALUE, ADDRESS V$SESSION SQL_HASH_VALUE, SQL_ADDRESS
HASH_VALUE, ADDRESS V$SQLTEXT, V$SQL, V$OPEN_CURSOR HASH_VALUE, ADDRESS
SQL_TEXT V$DB_OBJECT_CACHE NAME

示例:
1.查看消耗资源最多的SQL:
SELECT hash_value, executions, buffer_gets, disk_reads, parse_calls
FROM V$SQLAREA
WHERE buffer_gets > 10000000 OR disk_reads > 1000000
ORDER BY buffer_gets + 100 * disk_reads DESC;

2.查看某条SQL语句的资源消耗:
SELECT hash_value, buffer_gets, disk_reads, executions, parse_calls
FROM V$SQLAREA
WHERE hash_Value = 228801498 AND address = hextoraw('CBD8E4B0');
 
学习动态性能表5-V$SESSION2007年10月31日 星期三 13:40在本视图中,每一个连接到数据库实例中的session都拥有一条记录。包括用户session及后台进程如DBWR,LGWR,arcchiver等等。

V$SESSION中的常用列
V$SESSION是基础信息视图,用于找寻用户SID或SADDR。不过,它也有一些列会动态的变化,可用于检查用户。如例:
SQL_HASH_VALUE,SQL_ADDRESS:这两列用于鉴别默认被session执行的SQL语句。如果为null或0,那就说明这个session没有执行任何SQL语句。PREV_HASH_VALUE和PREV_ADDRESS两列用来鉴别被session执行的上一条语句。

注意:当使用SQL*Plus进行选择时,确认你重定义的列宽不小于11以便看到完整的数值。

STATUS:这列用来判断session状态是:
Achtive:正执行SQL语句(waiting for/using a resource)
Inactive:等待操作(即等待需要执行的SQL语句)
Killed:被标注为删除

下列各列提供session的信息,可被用于当一个或多个combination未知时找到session。

Session信息
SID:SESSION标识,常用于连接其它列
SERIAL#:如果某个SID又被其它的session使用的话则此数值自增加(当一个   SESSION结束,另一个SESSION开始并使用了同一个SID)。
AUDSID:审查session ID唯一性,确认它通常也用于当寻找并行查询模式
USERNAME:当前session在oracle中的用户名。

Client信息
数据库session被一个运行在数据库服务器上或从中间服务器甚至桌面通过SQL*Net连接到数据库的客户端进程启动,下列各列提供这个客户端的信息
OSUSER:客户端操作系统用户名
MACHINE:客户端执行的机器
TERMINAL:客户端运行的终端
PROCESS:客户端进程的ID
PROGRAM:客户端执行的客户端程序
要显示用户所连接PC的 TERMINAL、OSUSER,需在该PC的ORACLE.INI或Windows中设置关键字TERMINAL,USERNAME。

Application信息
调用DBMS_APPLICATION_INFO包以设置一些信息区分用户。这将显示下列各列。
CLIENT_INFO:DBMS_APPLICATION_INFO中设置
ACTION:DBMS_APPLICATION_INFO中设置
MODULE:DBMS_APPLICATION_INFO中设置
下列V$SESSION列同样可能会被用到:
ROW_WAIT_OBJ#
ROW_WAIT_FILE#
ROW_WAIT_BLOCK#
ROW_WAIT_ROW#

V$SESSION中的连接列

Column         View       Joined Column(s)
SID   V$SESSION_WAIT,,V$SESSTAT,,V$LOCK,V$SESSION_EVENT,V$OPEN_CURSOR   SID
(SQL_HASH_VALUE, SQL_ADDRESS)   V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
(PREV_HASH_VALUE, PREV_SQL_ADDRESS) V$SQLTEXT, V$SQLAREA, V$SQL (HASH_VALUE, ADDRESS)
TADDR        V$TRANSACTION     ADDR
PADDR        V$PROCESS      ADDR


示例:
1.查找你的session信息
SELECT SID, OSUSER, USERNAME, MACHINE, PROCESS
   FROM V$SESSION WHERE audsid = userenv('SESSIONID');

2.当machine已知的情况下查找session
SELECT SID, OSUSER, USERNAME, MACHINE, TERMINAL
   FROM V$SESSION
WHERE terminal = 'pts/tl' AND machine = 'rgmdbs1';

查找当前被某个指定session正在运行的sql语句。假设sessionID为100
select b.sql_text
   from v$session a,v$sqlarea b
   where a.sql_hash_value=b.hash_value and a.sid=100
寻找被指定session执行的SQL语句是一个公共需求,如果session是瓶颈的主要原因,那根据其当前在执行的语句可以查看session在做些什么。
 
v$session 表中比较常用的几个字段说明^_^

1. sid,serial#
通过sid我们可以查询与这个session相关的各种统计信息,处理信息.
a. select * from v$sesstat where sid = :sid;
查询用户相关的各种统计信息.
select a.sid,a.statistic#,b.name,a.value
from v$sesstat a,v$statname b
where a.statistic# = b.statistic#
and a.sid = :sid;

b. 查询用户相关的各种io统计信息
select * from v$sess_io where sid = :sid;

c. 查询用户想在正在打开着的游标变量.
select * from v$open_cursor where sid = :sid;

d. 查询用户当前的等待信息. 以查看当前的语句为什么这么慢/在等待什么资源.
select * from v$session_wait where sid = :sid ;

e. 查询用户在一段时间内所等待的各种事件的信息. 以了解这个session所遇到的瓶颈^_^
select * from v$session_event where sid = :sid;

f. 还有, 就是当我们想kill当前session的时候可以通过sid,serial#来处理.
alter system kill session :sid,:serail#;

2. paddr.字段, process addr, 通过这个字段我们可以查看当前进程的相关信息, 系统进程id,操作系统用户信息等等.
select a.pid,a.spid,b.name,b.description,a.latchwait,a.latchspin,a.pga_used_mem,a.pga_alloc_mem,a.pga_freeable_mem,a.pga_max_mem
from v$process a,v$bgprocess b
where a.addr = b.paddr(+)
and a.addr = :paddr

3. command 字段, 表明当前session正在执行的语句的类型.请参考reference.

4. taddr 当前事务的地址,可以通过这个字段查看当前session正在执行的事务信息, 使用的回滚段信息等^_^
select b.name rollname,a.*
from v$transaction a,v$rollname b
where a.xidusn = b.usn
and a.addr = 585ec18c;

5. lockwait字段, 可以通过这个字段查询出当前正在等待的锁的相关信息.
select *
from v$lock
where (id1,id2) = (
         select id1,id2 from v$lock where kaddr = 57c68c48
)

6. (sql_address,sql_hash_value) (prev_sql_addr,prev_hash_value) 根据这两组字段, 我们可以查询到当前session正在执行的sql语句的详细信息.

select * from v$sqltext where address = :sql_address and hash_value = :sql_hash_value;

7.row_wait_obj#,row_wait_file#,row_wait_block#,row_wait_row#
可以通过这几个字段查询现在正在被锁的表的相关信息.^_^
a. 首先得到被锁的的信息
select * from dba_objects where object_id = :row_wait_obj#;
b. 根据row_wait_file#可以找出对应的文件的信息.
select * from v$datafile where file# = :row_wait_file#.
c. 在根据以上四个字段构造出被锁的字段的rowid信息.
select dbms_rowid.rowid_create(1,:row_wait_obj#,:row_wait_file#,:row_wait_block#,:row_wait_row#) from dual;

8. logon_time 当前session的登录时间.
9. last_call_et 该session idle的时间, 每3秒中更新一次^_^
学习动态性能表第六篇-(1)-V$SESSION_WAIT2007年10月31日 星期三 13:43这是一个寻找性能瓶颈的关键视图。它提供了任何情况下session在数据库中当前正在等待什么(如果session当前什么也没在做,则显示它最后的等待事件)。当系统存在性能问题时,本视图可以做为一个起点指明探寻问题的方向。
  V$SESSION_WAIT中,每一个连接到实例的session都对应一条记录。

V$SESSION_WAIT中的常用列

SID: session标识
EVENT: session当前等待的事件,或者最后一次等待事件。
WAIT_TIME: session等待事件的时间(单位,百分之一秒)如果本列为0,说明session当前session还未有任何等待。
SEQ#: session等待事件将触发其值自增长
P1, P2, P3: 等待事件中等待的详细资料
P1TEXT, P2TEXT, P3TEXT: 解释说明p1,p2,p3事件

附注:
1.State字段有四种含义﹕
Waiting:SESSION正等待这个事件。
Waited unknown time:由于设置了timed_statistics值为false,导致不能得到时间信息。表示发生了等待,但时间很短。
Wait short time:表示发生了等待,但由于时间非常短不超过一个时间单位,所以没有记录。
Waited knnow time:如果session等待然后得到了所需资源,那么将从waiting进入本状态。

Wait_time值也有四种含义:
值>0:最后一次等待时间(单位:10ms),当前未在等待状态。
值=0:session正在等待当前的事件。
值=-1:最后一次等待时间小于1个统计单位,当前未在等待状态。
值=-2:时间统计状态未置为可用,当前未在等待状态。

3.Wait_time和Second_in_wait字段值与state相关:
如果state值为Waiting,那么wait_time值无用。Second_in_wait值是实际的等待时间(单位:秒)。
如果state值为Wait unknow time,那么wait_time值和Second_in_wait值都无用。
如果state值为Wait short time,那么wait_time值和Second_in_wait值都无用。
如果state值为Waiting known time,那么wait_time值就是实际等待时间(单位:秒),Second_in_wait值无用。

V$SESSION_WAIT中的连接列

Column View Joined Column(s)
SID V$SESSION SID

示例:
1.列出当前系统的等待事件
SELECT event,
sum(decode(wait_time,0,1,0)) "Curr",
sum(decode(wait_time,0,0,1)) "Prev",
count(*)"Total"
FROM v$session_wait GROUP BY event ORDER BY count(*);
EVENT Prev Curr Tot
--------------------------------------------- ---- ----- -----
PL/SQL lock timer 0 1 1
SQL*Net more data from client 0 1 1
smon timer 0 1 1
pmon timer 0 1 1
SQL*Net message to client 2 0 2
db file scattered read 2 0 2
rdbms ipc message 0 7 7
Enqueue 0 12 12
pipe get 0 12 12
db file sequential read 3 10 13
latch free 9 6 15
SQL*Net message from client 835 1380 2215

这个按事件和wait_time的分组查询列出下列的信息:
多数的session都是空闲事件如:SQL*Net message from client, pipe get, PMON timer等。
session的cpu占用可以通过上次session的非等待事件大致算出,除此问题外:看起来多数session没有在等待什么事情(难道他们都在干活?)但其最后等待事件都是SQL*Net message from client。

列出指定ID的等待事件
select * from v$session_wait where sid=100;

应用p1,p2,p3进行等待事件的分析
v$session_wait视图的列代表的缓冲区忙等待事件如下:
P1—与等待相关的数据文件的全部文件数量。
P2—P1中的数据文件的块数量。
P3—描述等待产生原因的代码。
例:select p1 "File #", p2 "Block #", p3 "Reason Code"
  from v$session_wait
  where event = 'buffer busy waits';
如果以上查询的结果显示一个块在忙等待,以下的查询将显示这一块的名称和类型:
select owner, segment_name, segment_type
 from dba_extents
 where file_id = &P1 and &P2 between block_id and block_id + blocks -1;

  我们也可以查询dba_data_files以确定等待的文件的file_name,方法是使用v$session_wait中的P1。
  从v$session_wait中查询P3(原因编码)的值可以知道session等待的原因。原因编码的范围从0到300,下列为部分编码所代表的事项:
0 块被读入缓冲区。
100 我们想要NEW(创建)一个块,但这一块当前被另一session读入。
110 我们想将当前块设为共享,但这一块被另一session读入,所以我们必须等待read()结束。
120 我们想获得当前的块,但其他人已经将这一块读入缓冲区,所以我们只能等待他人的读入结束。
130 块被另一session读入,而且没有找到其它协调的块,所以我们必须等待读的结束。缓冲区死锁后这种情况也有可能产生。所以必须读入块的CR。
200 我们想新创建一个block,但其他人在使用,所以我们只好等待他人使用结束。
210 Session想读入SCUR或XCUR中的块,如果块交换或者session处于非连续的TX模式,所以等待可能需要很长的时间。
220 在缓冲区查询一个块的当前版本,但有人以不合法的模式使用这一块,所以我们只能等待。
230 以CR/CRX方式获得一个块,但块中的更改开始并且没有结束。
231 CR/CRX扫描找到当前块,但块中的更改开始并且没有结束。
 
学习动态性能表(六)-(2)-V$SESSION_EVENT2007年10月31日 星期三 13:43本视图记录了每个session的每一项等待事件。由上文所知V$SESSION_WAIT显示了session的当前等待事件,而V$SESSION_EVENT则记录了session自启动起所有的事件。

V$SESSION_EVENT中的常用列
SID:session标识
EVENT:session等待的事件
TOTAL_WAITS:此session当前事件的总等待数
TIME_WAITED:此session总等待时间(单位,百分之一秒)
AVERAGE_WAIT:此session当前事件平均等待时间(单位,百分之一秒)
TOTAL_TIMEOUTS:等待超时次数

其它用法与V$SESSION_WAIT相似,不详述了


附注:

Oracle的等待事件是衡量Oracle运行状况的重要依据及指标。等待事件的概念是在Oracle7.0.1.2中引入的,大致有100个等待事件。在Oracle 8.0中这个数目增加到了大约150个,在Oracle8i中大约有200个事件,在Oracle9i中大约有360个等待事件。主要有两种类别的等待事件,即空闲(idle)等待事件和非空闲(non-idle)等待事件。
关于空闲事件和非空闲事件目前通过google可以搜索到非常多详尽的相关信息,同时
Oracle Database Performance Tuning Guide and Reference中关于Wait Events也有非常详尽的描述,在此就不多费口舌了。不过我在itpub论坛看到有热心人整理的chm格式非空闲事件说明,有兴趣的朋友可以下载,链接如下:
非空闲事件说明

 
学习动态性能表(七)--V$PROCESS2007年10月31日 星期三 13:44视图包含当前系统oracle运行的所有进程信息。常被用于将oracle或服务进程的操作系统进程ID与数据库session之间建立联系。在某些情况下非常有用:
1.如果数据库瓶颈是系统资源(如:cpu,内存),并且占用资源最多的用户总是停留在某几个服务进程,那么进行如下诸项:

1>.找出资源进程
2>.找出它们的session,你必须将进程与会话联系起来。
3>.找出为什么session占用了如此多的资源

2.SQL跟踪文件名是基于服务进程的操作系统进程ID。要找出session的跟踪文件,你必须将session与服务进程联系起来。
3.某些事件,如rdbms ipc reply,鉴别session进程的Oracle进程ID在等什么。要发现这些进程在做什么,你必须找出它们的session。
4.你所看到的服务器上的后台进程(DBWR,LGWR,PMON等)都是服务进程。要想知道他们在做什么,你必须找到他们的session。

V$PROCESS中的常用列
ADDR:进程对象地址
PID:oracle进程ID
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
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 JSSjunsansi PlSqlDev.exe
9 13 3420 JSSjunsansi PlSqlDev.exe
13 14 660 JSSjunsansi 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
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/14876437/viewspace-557761/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-02-16

  • 博文量
    91
  • 访问量
    43593