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 全文を取得することが出来ます。