ロック待ち状態のセッションおよびSQLを確認する

Pocket

【概要】
下記の出力結果の状況により、ロック状況を調査する。
【SQL文】
/*
|| ■ロック待ち状態のセッションおよびSQLを確認する
||
|| 【項目の説明】
|| LOCK_HOLD :ロック待ちの原因となっているオブジェクト名
|| LOCK_PROGRAM :ロックを保持しているユーザ名、SID、SERIAL#
|| LOCK_PROCESS :ロックを保持しているプログラム名
|| LOCK_TERM :ロックを保持しているOSプロセス番号
|| LOCK_OBJECT :ロックを保持している端末名
|| LOCK_WAIT :ロックを待機しているユーザ名、SID、SERIAL#
|| WAIT_PROGRAM :ロックを待機しているプログラム名
|| WAIT_PROCESS :ロックを待機しているOSプロセス番号
|| WAIT_TERM :ロックを待機している端末名
|| LOCK_SQL :ロックを保持しているユーザが現在実行している
|| WAIT_SQL :ロックを待機しているユーザが実行しているSQL文
*/
set echo off
set lines 120
set pages 1000

clear col
ttitle off

col LOCK_HOLD for a30 head “ロック保持ユーザ(SID:SERIAL#)”
col LOCK_PROGRAM for a14 head “ロック保持プログラム名”
col LOCK_PROCESS for a13 head “ロック保持プロセス”
col LOCK_TERM for a20 head “ロック保持端末名”
col LOCK_OBJECT for a30 head “ロックオブジェクト名”
col LOCK_WAIT for a30 head “ロック待機ユーザ(SID:SERIAL#)”
col WAIT_PROGRAM for a14 head “ロック待機プログラム名”
col WAIT_PROCESS for a13 head “ロック待機プロセス”
col WAIT_TERM for a20 head “ロック待機端末名”
col LOCK_SQL for a120 head “ロック保持ユーザが現在実行中のSQL”
col WAIT_SQL for a120 head “ロックを待機しているSQL”

ttitle left ‘■■■■ ロック待ちセッションとSQL情報 ■■■■’
spool sesslock_info.sql

SELECT vs1.username || ‘(‘ || vs1.sid || ‘:’||vs1.serial#||’)’ LOCK_HOLD
, substr(vs1.program114) LOCK_PROGRAM
, vs1.process LOCK_PROCESS
, vs1.terminal LOCK_TERM
, do.owner||’.’||do.object_name LOCK_OBJECT
, vs2.username || ‘(‘ || vs2.sid || ‘:’||vs2.serial#||’)’ LOCK_WAIT
, substr(vs2.program114) WAIT_PROGRAM
, vs2.process WAIT_PROCESS
, vs2.terminal WAIT_TERM
, vst1.sql_text LOCK_SQL
, vst2.sql_text WAIT_SQL
FROM v$session vs1
, dba_objects do
, v$lock vl
, v$session vs2
, v$sqltext vst1
, v$sqltext vst2
WHERE vl.id1 = do.object_id
AND vs1.sid = vl.sid
AND vs1.lockwait IS NULL
AND vs2.lockwait IS NOT NULL
AND vl.type = ‘TM’
AND vst1.address = vs1.sql_address
AND vst1.hash_value = vs1.sql_hash_value
AND vst2.address = vs2.sql_address
AND vst2.hash_value = vs2.sql_hash_value
ORDER BY 1, 2, 3
;
spooll off
clear col
ttitle off
set line 80

以上です =リヲワ