SQL
oracle

実行中のSQLのステータスを確認する

More than 3 years have passed since last update.

V$SESSIONをみればよい。
以上。

と言いたいところだが、
情報が多すぎて、重くて見辛いEMのSQLリアルタイム監視のかわりに簡便に流れているSQLを監視したいという意図でV$SQLAREAなどと合わせたSQLを書いた。

移行作業の裏で、シナリオテスト、性能テストが走っていたりする忙しいDBの監視にはこういう情報があると切り分けが早くて便利だと思ったので投稿。

欲しい情報は、
・インスタンス
・スキーマ名
・SQL_ID
・待機クラス
・イベント
・経過時間
・SQLの一部
ぐらいあれば十分なので、下記のSQLで調べる。

現在流れているSQLのプランを取得
select 
    a.INST_ID,
    a.SCHEMANAME,
    a.SQL_ID,
    a.WAIT_CLASS,
    a.EVENT,
--  b.SQL_FULLTEXT,
    trunc((sysdate - a.SQL_EXEC_START) * 24 * 60 * 60,2) as "経過",
--  a.WAIT_TIME,
    substr(b.SQL_TEXT,1, 60) as sql_head
from 
    gV$SESSION a,
    gV$sqlarea b
where 1 = 1
and status = 'ACTIVE'
and a.INST_ID = b.INST_ID
and a.SQL_ID = b.SQL_ID
order by a.INST_ID,a.SQL_EXEC_START 
;

おかしなイベントが発生している場合、

select * from table(DBMS_XPLAN.DISPLAY_CURSOR('{SQL_ID}'));

などで、プランをすぐに確認できる。
ただ、待機クラス・イベント自体あまり知らないので、どこかでまとめたい。
RAC特有のイベントとかあるらしいので興味ある。