2011年6月14日火曜日

OracleのプロセスIDから該当SQLを探す

スズキです。

Oracleサーバを運用していると、"top"の出力が下記のようになってるときに
そのプロセスに該当するSQLを確認したいことがあります。

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                            
13838 oracle    25   0 51.7g 589m 558m R   99  0.8  48:23.16 oracle                                                                              
13846 oracle    25   0 51.7g 588m 557m R   99  0.8  48:52.92 oracle                                                                              
27515 oracle    18   0 51.7g 1.3g 1.3g R   78  1.9   0:02.45 oracle                                                                              
27519 oracle    15   0 51.7g 391m 387m S   13  0.6   0:00.40 oracle                                                                              
27513 oracle    15   0 51.7g  99m  95m S    4  0.1   0:00.16 oracle         

そのような場合は、"v$process p, v$session s, v$sql"を利用することで探すことができます。
具体的には下記のようなSQLになります。("v$process"の"spid"でプロセスIDを指定します)

select q.sql_text, q.cpu_time
from v$process p, v$session s, v$sql q
where p.spid       = 13838
  and s.paddr      = p.addr
  and q.address    = s.sql_address
  and q.hash_value = s.sql_hash_value

結果はこんな感じです。

select q.sql_text, q.cpu_time
SQL_TEXT
--------------------------------------------------------------------------------
  CPU_TIME
----------
SELECT ...
6.7316E+10

ただし上記の"v$sql"では、SQLの一部分しか取得できないので、SQL全文を取得するには、
"v$sql_text"も結合する必要があります。

"v$sql_text, $sql"で取得できるデータは、コチラが参考になります。

Oracleマスターの勉強はじめる前に、業務のOracleが本格的になってきた...
--------
http://www.suz-lab.com

0 コメント: