Wednesday, October 14, 2009

Row Cache LockのホルダーをV$ビューで探すこと

Hanganalyzeコマンドを利用すると手軽にRow Cache Lockのホルダーを探すのができます。

connect sys/oracle as sydba

oradebug setmypid
oradebug hanganalyze 3


-- trace file
==============
HANG ANALYSIS:
==============
Open chains found:
Chain 1 : :
<0/158/44363/0x3424fb7c/5504/No Wait>
-- <0/134/928/0x3424f58c/4600/row cache lock>

トレースファイルを通じずにV$ビューだけでRow Cache Lockのホルダーを探し出そうとする場合もあります。V$ROWCACHE_PARENTを利用すれば可能です。簡単な例で説明してみます。


まず、次のようにNOCACHE属性のSequenceを作ってから二つのセッションからNextvalueの呼び出しを繰り返します。NOCACHEのSequenceはNextvalueを呼び出すたびにRow Cache Lockを5番(SRX)モードで獲得します。従ってRow Cache Lockの競合を再現しやすいです。


create sequence s1 nocache;

-- temp.sql
declare
v_value number;
begin
for idx in 1 .. 100000 loop
select s1.nextval into v_value from dual;
end loop;
end;
/

ho start sqlplus ukja/ukja@ukja1021 @temp
ho start sqlplus ukja/ukja@ukja1021 @temp

V$ROWCACHE_PARENTビューを次のように検索してみれば、Row Cache Lockのホルダーセッションを探し出せます。Where以下の条件を注意深く見てください。

col sid new_value sid

select h.address, h.saddr, s.sid, h.lock_mode
from v$rowcache_parent h, v$rowcache_parent w, v$session s
where h.address = w.address and
w.saddr = (select saddr from v$session where event = 'row cache lock'
and rownum = 1) and
h.saddr = s.saddr and
h.lock_mode > 0
;

ADDRESS SADDR SID LOCK_MODE
-------- -------- ---------- ----------
283AFB50 3432EB34 145 5

セッションIDを通じてホルダーセッションの詳しい情報が獲得できます。

UKJA@ukja1021> @session &sid
UKJA@ukja1021> set echo off
01. basic session info
SID : 145
SERIAL# : 447
SPID : 2328
MACHINE : POWER_GROUP\UKJAX
PROGRAM : sqlplus.exe
PGA : 515668
UGA : 156280
LAST_CALL_ET : 13
LOGON_TIME : 2009/10/15 13:50:31
-----------------

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.03
02. session wait
SID : 145
EVENT : row cache lock
P1 : 13
P1RAW : 0000000D
P2 : 0
P2RAW : 00
P3 : 5
P3RAW : 00000005
SECONDS_IN_WAIT : 0
STATE : WAITING
-----------------

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.01
03. process info
PID : 23
PROGRAM : ORACLE.EXE (SHAD)
PGA_USED_MEM : 324361
PGA_ALLOC_MEM : 623853
PGA_MAX_MEM : 623853
-----------------

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.01
04. sql info
SID : 141
SHARABLE_MEM : 8640
PERSISTENT_MEM : 1156
RUNTIME_MEM : 592
EXECUTIONS : 100000
FETCHES : 100000
BUFFER_GETS : 403341
SQL_TEXT : SELECT S1.NEXTVAL FROM DUAL
-----------------


05. sql plan info

PLAN_TABLE_OUTPUT
---------------------------------------------------------------------

SQL_ID 8c3n1ysfzzd1z, child number 0
-------------------------------------
SELECT S1.NEXTVAL FROM DUAL

Plan hash value: 2479889702

-----------------------------------------------------------------
| Id | Operation | Name | Rows | Cost (%CPU)| Time |
-----------------------------------------------------------------
| 0 | SELECT STATEMENT | | | 2 (100)| |
| 1 | SEQUENCE | S1 | | | |
| 2 | FAST DUAL | | 1 | 2 (0)| 00:00:01 |
-----------------------------------------------------------------
...

使うことがぜんぜんなさそうなV$ROWCACHE_PARENTビューの有用な使用例となるでしょう。

No comments:

Post a Comment