Oracle10g 動的ビューV$SESSIONのおさらい の巻

<Oracle10g 動的ビューV$SESSIONのおさらい の巻>
ペンネーム:アイスケーキ

GWも終わってホット一息。。。でも安心は禁物、気がつけば五月病。
今年はGWが長かったので、そろそろ反動が来そうな予感がありますが頑張っ
ていきましょう。

今週は「動的ビューV$SESSION」についておさらいをしていきます。

★☆★
Oracle 10gよりV$SESSION動的ビューに
BLOCKING_SESSION, BLOCKING_SESSION_STATUSの2つの列が追加されていてロッ
クされているオブジェクトの確認を行うことが可能となっています。場合によ
っては以前ようにX$BHから追いかける手間もなく、とても楽です。

取得可能ものは
○ブロックしている/されているユーザ名
○ブロックしている/されているユーザのWAITイベント名
○ブロックされているオブジェクトの番号
○ブロックされているオブジェクトが属するファイル番号
○ブロックされているオブジェクトのブロック番号
○ブロックされているオブジェクトの行番号
等です。

v$session に追加された列の詳細は、マニュアル
「リファレンス リリース1(10.x)」を参照下さい。

☆★☆★☆★
早速みてみましょう。

◆環境
Microsoft Windows XP Pro
Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 – Production
With the Partitioning, OLAP and Data Mining options

◆設定
最初にテスト用のワークテーブルを作成します。
ブロックしているユーザ(USER1)とブロックされているユーザ(USER2)のWAIT
EVENTを参照します。

「USER1」

  SQL> create table wk_tbl(item1 number,item2 number);
       表が作成されました。
  SQL> insert into wk_tbl values(100,100);
       1行が作成されました。
  SQL> insert into wk_tbl values(200,200);
       1行が作成されました。
  SQL> commit;
       コミットが完了しました。
  SQL> update user1.wk_tbl set item2=300;
       2行が更新されました。

「USER2」

  SQL> update user1.wk_tbl set item2=400;

◆確認
○ブロックしている/されているユーザのWAITイベント名を参照
「other」

SQL> select
         x.username "Blocking User",
         x.event "Wait Event",
         y.username "Blocked User",
         y.event "Wait Event"
        from v$session x, v$session y
        where y.blocking_session=x.sid 
        and   y.blocking_session_status='VALID';

Blocking User Wait Event
------------- ------------------------------
USER1         SQL*Net message from client

Blocked User  Wait Event
------------- ------------------------------
USER2         enq: TX - row lock contention

USER2がTXロックイベントで待たされているのが分かります。

○ブロックされているオブジェクトについて参照

SQL> select
  2            x.username "Blocking User",
  3            y.username "Blocked User",
  4            y.row_wait_obj# "Object#",
  5            y.row_wait_file# "File#",
  6            y.row_wait_block# "Block#",
  7            y.row_wait_row# "Row#"
  8           from v$session x, v$session y
  9           where y.blocking_session=x.sid;

Blocking User Blocked User    Object#      File#     Block#       Row#
------------- ------------ ---------- ---------- ---------- ----------
USER1         USER2             47114          5         10         0

USER2の待たされているオブジェクトID、ファイルID、ブロックIDが分かります。

○オブジェクト名を参照するには

SQL> select OWNER,OBJECT_NAME from dba_objects where OBJECT_ID = 47114;

OWNER     OBJECT_NAME
--------- -----------
USER1     WK_TBL

○ファイル関連情報を参照するには

SQL> select TABLESPACE_NAME,BYTES,FILE_NAME 
 2   from dba_data_files where FILE_ID = 5;

TABLESPACE_NAME                 BYTES
------------------------------ ----------
USERS_CH                        10485760

FILE_NAME
----------------------------------------------------------------
C:ORACLEPRODUCT10.1.0ORADATAORCLDATAFILEO1_MF_USERS_1.DBF

○エクステント関連を参照するには

SQL> SELECT OWNER,SEGMENT_NAME,EXTENT_ID FROM dba_extents 
 2   WHERE FILE_ID = 5 AND block_id = 10;

OWNER         SEGMENT_NAME  EXTENT_ID
------------- ------------- ---------
USER1         WK_TBL           0

○レコード位置を参照するには

SQL> select rowid,item1,(row_number() over (order by rowid))-1 "Row"
 2   from user1.wk_tbl;

ROWID                   ITEM1       Row
------------------ ---------- ----------
AAALgLAAFAAAAAKAAA        100          0 <<<
AAALgLAAFAAAAAKAAB        200          1

■おさらい
Oracle 10gよりV$SESSION動的ビューに追加されたブロック元・先の関連情報
が追加されています。
結構つかえるので、10gユーザとなった際は使ってみてください。

今週はここまで。

初夏の茅ヶ崎より