共有プール領域に関する検証 その4

投稿日: 2002年8月07日

<共有プールに関する検証 その4> ペンネーム ダーリン

– V$SQLAREA と 親カーソル --

前回までは、V$SQLAREA表を使ってSQLの情報を取得してみたが、ではその
V$SQLAREA表自体はどのような構成になっているのだろうか。
今回はV$SQLAREA表を詳しく見てみよう。

V$SQLAREA表は共有プールに存在するSQLについての統計情報を見ることの出来
るビューで、ひとつのSQLにつき1レコードが存在する。
ではその内訳は、というと、、、何のことかお分かりだろうか。

そう、カーソル。
V$SQLAREA表は1SQLで使用するカーソルの情報を集計して表現するが、内部的
には1つのSQL(HASH_VALUEの単位で)に複数のカーソルが存在する。
これらは、親カーソル1つとその子カーソルという形で表現され、カーソルが
ひとつしか存在しない場合でも、最低1つずつの親カーソルと子カーソルが存
在している。

この(子)カーソル単位で統計情報を現しているビューはV$SQL表だ。
このビューでは、子カーソル単位でSQL情報を見ることが出来る。

実は、これら親カーソル/子カーソルの関連をメモリ上で垣間見ることが出
来る。

ちょっとメモリ情報を取得してみよう。

まず、メモリ上で追いかける対象のSQL文を発行しておく。

SQL> connect scott/tiger

SQL> select * from emp;

続いて、以下のコマンドを発行し、初期化パラメータ”user_dump_dest”で指
定されたディレクトリに作成されるダンプファイルを見てみよう。

SQL> alter session set events 'immediate trace name library_cache level 4';

以下は、出力されたダンプファイルの抜粋である。

*************************************************************************

LIBRARY OBJECT HANDLE: handle=821e121c       <------(※2)
name=select * from emp                 <------------(※1)
hash=b382f8a6 timestamp=08-06-2002 09:41:20  <------(※3)
namespace=CRSR flags=RON/KGHP/TIM/PN0/SML/[12010000]
kkkk-dddd-llll=0000-0001-0001 lock=N pin=0 latch=0
lwt=821e1234[821e1234,821e1234] ltm=821e123c[821e123c,821e123c]
pwt=821e124c[821e124c,821e124c] ptm=821e12a4[821e12a4,821e12a4]
ref=821e1224[821e1224, 821e1224] lnd=821e12b0[821e12b0,821e12b0]
  LOCK OWNERS:
      lock     user  session count mode flags
-------- -------- -------- ----- ---- ------------------------
82451088 82c9e4dc 82c9e4dc     1 N   [00]
LIBRARY OBJECT: object=809b8cf4
type=CRSR flags=EXS[0001] pflags= [00] status=VALD load=0
CHILDREN: size=16
child#    table reference   handle
------ -------- --------- --------
      0 809b8e88  8079344c 819443ec
DATA BLOCKS:
data#     heap  pointer status pins change alloc(K)  size(K)
----- -------- -------- ------ ---- ------ -------- --------
      0 81851570 809b8d78 I/P/A     0 NONE       0.80     1.05

*************************************************************************

“name”と示された部分にSQL文が表示してあり、先ほど発行したSQL文が確認
できる。(※1)

今回は簡単なSQL文を発行したため、間違えることはないと思うが、SQL文を特
定したい場合はV$SQLAREAの”ADDRESS”や、”HASH_VALUE”の値を使用して検索す
るとすぐに見つけることが出来る。
“ADDRESS”の値で検索する場合は、上記の”handle”(※2)の値に、また、
“HASH_VALUE”の値で検索する場合は、16進数に変換した値が”hash”(※3)に、
それぞれヒットする。

また、ここで検索された情報は、”namespace=CRSR”や、”type=CRSR”となって
いることから、カーソル情報であることがわかる。

では、この情報は親カーソルか子カーソルか?

結論から言うと、親カーソルである。子カーソルの情報と並べてみればなんと
なく違いはわかるが、簡単な見分け方は、handle(※2)を検索してみる方法
だ。親カーソルの場合は他に存在しない。

では、子カーソルの情報はどうやって見つけるか。

同じダンプファイル内に出力されているので、皆さん探してみてください。
もっとも意表をついた探し方を教えてくれた読者の方には、素敵なグッズが用
意されているかも。

それは次回のお楽しみ。

以上 帰省渋滞をどうやって避けようか頭がいたい 茅ヶ崎にて