ロックに関する検証 その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を取得して、ビットマップ・インデックス構
造の核心に迫ってみる。
以上 茅ヶ崎にて