ロックに関する検証 その6

~ロックに関する検証 その6~
ペンネーム ちゃむ

前回は、ビットマップ・インデックスの構造の概要を説明した。
今回は、ビットマップ・インデックスの構造の詳細をさらに見ていこう。

前回使用したカーディナリティ4のビットマップ・インデックスを使用し、詳細
な構造を見ていこう。詳細な構造を知るには、やはりお馴染みのダンプが必要
である。今回は、Oracle8以降のダンプの取得方法で行なうが、Oracle7以前の
方法を知りたければ、バックナンバーの「続・インデックスに関する検証」を
参照いただきたい。

********************** カーディナリティ4の場合 ***********************

SQL> CREATE BITMAP INDEX BITMAP_4 ON T10MAN_COPY_4(MGR)
     STORAGE (INITIAL 2K NEXT 2K PCTINCREASE 0 MAXEXTENTS UNLIMITED) ;

SQL> SELECT SEGMENT_NAME,BLOCKS,EXTENTS FROM DBA_SEGMENTS
     WHERE SEGMENT_NAME = 'BITMAP_4' ;

SEGMENT_NAME            BLOCKS   EXTENTS
-------------------- --------- ---------
BITMAP_4                    90        89

さらに細かく、EXTENTS=89個のすべてのエクステントのBLOCK_IDを見ていこう。
このBLOCK_IDが、後程行うダンプの解析で役に立つ。また、89行検索されてい
るが、当然これは、EXTENTS=89個と一致し、エクステントが89個あることを意
味する。また、セグメントヘッダーを含んでいるエクステント(BLOCK_ID=24065)
以外はすべてBLOCKS=1なので、1ブロックのエクステントであることを意味する。
ちなみに、この検証では、セグメントヘッダーとBranchブロックが同じエクス
テント内に1ブロックずつ格納された(インデックスの構造は通常、「ルート」、
「ブランチ」、「リーフ」といった具合に3階層構造となっている(詳しくは、
バックナンバー「インデックスに関する検証」を参照)。しかし、この検証で
用いたインデックスの構造は、比較的小さいため、「ルート」を除いた、
「ブランチ」、「リーフ」の2階層で構成されている。したがって、セグメント
の先頭に必ず存在するセグメント・ヘッダーと、インデックス構造の先頭に位
置する「ルート」(ここではブランチ)が、ここでは同じエクステント内に格
納されていることを表している)。

SQL> SELECT FILE_ID,BLOCK_ID,BLOCKS FROM DBA_EXTENTS
     WHERE SEGMENT_NAME = 'BITMAP_4' ORDER BY BLOCK_ID ;

  FILE_ID  BLOCK_ID    BLOCKS
--------- --------- ---------
        4     18333         1
        4     22960         1
        4     23025         1
        4     23043         1
        4     23075         1
        4     23133         1
        4     23146         1
        :       :           :
        :       :           :
        4     24065         2 ← セグメントヘッダーが含まれている
        :       :           :
        :       :           :
        4     83004         1
        4     83036         1
        4     83039         1
        4     83055         1
        4     83070         1
        4     83132         1
        4     83164         1

89行が選択されました。

次に、ビットマップ・インデックスBITMAP_4のTREE DUMPを取得する。DUMPを取
得するためには、OBJECT_IDが必要となる。

SQL> SELECT OBJECT_ID FROM DBA_OBJECTS WHERE OBJECT_NAME = 'BITMAP_4' ;

OBJECT_ID
---------
     5719

OBJECT_IDを指定してTREE DUMPを取得(初期化パラメータのUSER_DUMP_DESTに
設定されているディレクトリに出力される)

SQL> ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME TREEDUMP LEVEL 5719' ;

以前、ビットマップ・インデックスは、B-Treeインデックスの構造の中に格納
されていると説明したが、TREE DUMPを取得できるところからも明らかであろう。
以下のTREE DUMPを見ると、TREEの高さが2階層のインデックスであるというこ
とがわかる。前述してあるが、root-branch-leafという3階層構造ではなく、イ
ンデックスのサイズが小さいために、rootのないbranch-leafという構造になっ
ている。

また、TREE DUMPの中のnrow、rrow の違いは、バックナンバー
「続・インデックスに関する検証 その3」を参照していただきたいが、今回は、
nrowだけに着目して説明する。nrowは、インデックスのリーフに格納されてい
る行数と考えればよい。B-Treeインデックスであれば、この行数は、カラム長
にもよるが、20から50行くらいあるのが普通である。しかし、ビットマップ・
インデックスでは、殆どが1行で、多くても2行である。実は、ここにビットマップ・
インデックスのロックの問題が潜んでいるのであるが...。
branch blockに関しては、88行存在しているが、それは、リーフ・ブロックの
DBA(DATA BLOCK ADDRESS)とカラム値を含んでいるものであり、役割としては
B-Treeインデックスのbranchと殆ど同じである(若干構造は異なるが...)。

*************** ビットマップ・インデックスのTREE DUMP ****************

branch: 0x1005e02 16801282 (0: nrow: 88, level: 1)  ← branch block
   leaf: 0x1005da6 16801190 (-1: nrow: 1 rrow: 1)   ← reaf   block
   leaf: 0x1005f11 16801553 (0: nrow: 1 rrow: 1)
             :          :          :
             :          :          :
             :          :          :
   leaf: 0x10143ec 16860140 (16: nrow: 1 rrow: 1)
   leaf: 0x1005b34 16800564 (17: nrow: 1 rrow: 1)
   leaf: 0x1011795 16848789 (18: nrow: 1 rrow: 1)
   leaf: 0x1011867 16848999 (19: nrow: 1 rrow: 1)
   leaf: 0x10141b3 16859571 (20: nrow: 2 rrow: 2)
   leaf: 0x1014221 16859681 (21: nrow: 1 rrow: 1)
   leaf: 0x101443c 16860220 (22: nrow: 1 rrow: 1)
             :          :          :
             :          :          :
             :          :          :
   leaf: 0x101429e 16859806 (81: nrow: 1 rrow: 1)
   leaf: 0x101445c 16860252 (82: nrow: 1 rrow: 1)
   leaf: 0x1005fd9 16801753 (83: nrow: 1 rrow: 1)
   leaf: 0x100479d 16795549 (84: nrow: 1 rrow: 1)
   leaf: 0x10059b0 16800176 (85: nrow: 1 rrow: 1)
   leaf: 0x1005a6a 16800362 (86: nrow: 2 rrow: 2)

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

次回はさらに、詳細なBLOCK DUMPを取得して、ビットマップ・インデックス構
造の核心に迫ってみる。

以上 茅ヶ崎にて