Oracle で実行中のクエリー(SQL) を取得する方法


Oracle データベースで実行中の SQL を取得する方法

Oracle データベースでは V$SESSION というビューを SELECT することで、現在データベースに接続中のセッション情報を取得することが出来ます。しかしこれだけでは実行中の SQL の一部しか見れず、SQL の全文が見れないため正確なクエリー(SQL)が分からずトラブルが発生した際に困ってしまいます。

そこで実際にあるセッションで実行されている SQL を取得する方法と、全てのアクティブな接続で実行されている SQL を取得する2つのクエリー(SQL)を実行してみます。




あるセッションで実行されている SQL を取得する

まず既に問題のある接続が分かっている場合、その接続の SID を使って以下のように実行中の SQL を取得することが出来ます。

※なお SID は V$SESSION ビューから得ることが出来ます。"SID = 123" は V$SESSION ビューで得られた値に書き換える必要があります。

SELECT * FROM V$SESSION;

SELECT
  s.sid,
  s.serial#,
  s.status,
  s.machine,
  s.osuser,
  s.module,
  s.username,
  s.process,
  p.program,
  a.sql_text
FROM v$session s,
     v$sqlarea a,
     v$process p
WHERE s.PREV_HASH_VALUE = a.hash_value
  AND s.PREV_SQL_ADDR = a.address
  AND s.paddr = p.addr
  AND s.SID = 123
;

全てのアクティブな接続で実行されている SQL を取得する

次に現在アクティブな全ての接続の実行中のクエリー(SQL)を取得するには次のようにします。


SELECT
  s.sid,
  s.serial#,
  s.status,
  s.machine,
  s.osuser,
  s.module,
  s.username,
  s.process,
  p.program,
  a.sql_text
FROM v$session s,
     v$sqlarea a,
     v$process p
WHERE s.PREV_HASH_VALUE = a.hash_value
  AND s.PREV_SQL_ADDR = a.address
  AND s.paddr = p.addr
  AND s.STATUS = 'ACTIVE'
;

上記2つの SQL を使えば、データベースパフォーマンスが悪い場合や SQL に問題がある場合に非常に簡単に SQL 全文を取得することが出来ます。