web-dev-qa-db-ja.com

gv $ sessionを使用して、クエリがハングしているかどうかを確認します

Oracleでクエリを実行していますが、ハングしている場合とハングしていない場合があります。現在、約10時間実行されていますが、ロードしているデータの量に基づくと、不合理ではない可能性があります。

私はgv $ sessionでセッションを見ていて、その情報を変換して実際にアクティビティが発生しているかどうかを確認する方法があるのか​​、それともクエリがロックを待っているかハングしているのか疑問に思っていました。

このビューのドキュメントはすでに読んでいます ここ 。私は主に、Oracleでこれらのタイプの問題をデバッグした経験のある人からのヒントを探しています。

ありがとう!

6
Paul

gv$sessionevent列は、セッションが現在待機している待機イベントを示します。セッションが別のセッションによって保持されているある種のロックを待機している場合、eventは次のように通知します(たとえば、ロックを待機しているキューに入れられている場合は、「enq:TX-行ロックの競合」になります。別のセッションによって保持されている行)およびblocking_instanceblocking_sessionには、ロックの所有者のインスタンスとセッションIDが入力されます。 seconds_in_waitwait_time=0の場合)を調べて、セッションが現在の待機イベントで費やした秒数を判別することもできます。少なくとも、セッションが現在「スタック」しているかどうかはわかりますが、クエリが本当に終了するかどうかはわかりません。悪い計画がある場合は、「良い」状態になっている可能性があります。セッションが何かを実行しているが、クエリが実際には終了しないことを示すディスクI/Oの待機などの待機イベント。

8
Justin Cave

いくつかのさらなる調査とOllieのコメントに基づいて、問題のデバッグに役立つ次のクエリを思いつきました。

select s.sid, 
       s.username,
       s.machine,
       s.osuser, 
       cpu_time,
       (elapsed_time/1000000)/60 as minutes,
       sql_text
from gv$sqlarea a, gv$session s
where s.sql_id = a.sql_id
and s.machine like '####';


select lo.*, 
       a.sql_text
from gv$sqlarea a, gv$session_longops lo
where lo.sql_id = a.sql_id
and lo.sid = ####
order by lo.start_time;
4
Paul

これは、現在実行中のセッションを確認するのに役立ちます

select a.SID, a.SERIAL#, c.OBJECT_NAME 
from v$session a, v$locked_object b, user_objects c
where a.SID=b.SESSION_ID and b.OBJECT_ID=c.OBJECT_ID
0
Shyam D