ASSMに関する検証 その2

投稿日: 2007年3月28日

<ASSMに関する検証 その2>
ペンネーム: サマー・リーフ

▼前回のおさらい

セグメントの空き領域を管理する方法は、2種類ありました。

1.FREELIST管理
2.自動セグメント領域管理(ASSM)

従来のFREELIST管理と比較し自動セグメント領域管理は、内部的にどのように
なっているかをセグメントヘッダダンプを覗いて違いをみました

自動セグメント領域管理でのセグメントヘッダダンプでは、Level分けされた
ビットマップや High, Low HWM などがありましたね。

まずは、Level分けされたビットマップについて掘り下げていってみましょう。
High, Low HWM に関しては、別の回で取り上げます。

■環境

OS:WindowsXP
DB:Oracle10g EE Release 10.2.0.3

■Level分けされたビットマップ

前回、ITI1 スキーマ、ITI2 スキーマ所有のテーブルはセグメント領域管理
の違う表領域に作成していていることをご紹介しました。
前者は、自動セグメント領域管理(ASSM)表領域、後者が FREELIST管理の
表領域でしたね。

それでは自動セグメント領域管理(ASSM)の管理構造を見る為に、ITI1 ス
キーマの SUMMER_LEAF テーブルの情報を見ていきましょう。
セグメントヘッダブロックが、27番目のブロックである事が確認できます。

OWNER    SEGMENT_NAME           HEADER_FILE HEADER_BLOCK
-------- ---------------------- ----------- ------------
ITI1     SUMMER_LEAF             7           27
ITI2     SUMMER_LEAF             8           25

次に、再度 27番目のブロックのダンプの抜粋を見てみましょう。

  ↓ここから↓
  ********************************************************************
    Extent Control Header
  -----------------------------------------------------------------
  Extent Header:: spare1: 0      spare2: 0      #extents: 1      #blocks: 8
                  last map  0x00000000  #maps: 0      offset: 2716  
      Highwater::  0x01c00021  ext#: 0      blk#: 8      ext size: 8

  ~~

  Segment Type: 1 nl2: 1      blksz: 8192   fbsz: 0      
  L2 Array start offset:  0x00001434
  First Level 3 BMB:  0x00000000
  L2 Hint for inserts:  0x01c0001a
  Last Level 1   BMB:0x01c00019      <---- (1)
  Last Level II  BMB:0x01c0001a      <---- (2)
  Last Level III BMB:0x00000000      <---- (3)

  ~~

  ********************************************************************
  ↑ここまで↑

上記ダンプに追記したコメント (1)、(2)、(3)が、それぞれ Level1~IIIに分
かれています。
ブロックアドレスを16進数から10進数に変換してみます。

Last Level 1   BMB:0x01c00019  ⇒ 25番目のブロック
Last Level II  BMB:0x01c0001a  ⇒ 26番目のブロック
Last Level III BMB:0x00000000  ⇒ 対象ブロックなし

さて何が分かるでしょうか???

まず、セグメントヘッダブロック(27番目)より若いブロックが、Level 1
Level II となっている事がわかりますね。

う~ん、だから・・・という感じですが、
続けて Level 1、Level IIのブロックダンプを取得してみます。

Level 1のブロックダンプ(25番目のブロック)の取得

alter system dump datafile 7 block 25;

Level 1(FIRST LEVEL BITMAP BLOCK)の抜粋(自動セグメント領域管理)
むむ!ブロック毎の空き状態が、見えちゃいました!

  ↓ここから↓
  ********************************************************************
  Start dump data blocks tsn: 9 file#: 7 minblk 25 maxblk 25

  ~~

  frmt: 0x02 chkval: 0x061f type: 0x20=FIRST LEVEL BITMAP BLOCK

  ~~

  --------------------------------------------------------
  DBA Ranges :
  --------------------------------------------------------
   0x01c00019  Length: 8      Offset: 0      
  
   0:Metadata   1:Metadata   2:Metadata   3:75-100% free
   4:75-100% free   5:75-100% free   6:75-100% free   7:75-100% free
  ********************************************************************
  ↑ここまで↑

取得したダンプの最後の 2行を見てください。
参照しているセグメント(ITI1.SUMMER_LEAF テーブル)は、
0 ~ 7 まで 8 ブロック使用してますね。
また、各ブロックの使用用途は、以下と読み取れそうです。

0:Metadata     ⇒ Level 1 (FIRST LEVEL BITMAP BLOCK)
1:Metadata     ⇒ Level II(SECOND LEVEL BITMAP BLOCK)
2:Metadata     ⇒ セグメントヘッダブロック
3:75-100% free ⇒ 行 格納用
4:75-100% free ⇒ 行 格納用
5:75-100% free ⇒ 行 格納用
6:75-100% free ⇒ 行 格納用
7:75-100% free ⇒ 行 格納用

上記から、前回お伝えしたように、Level 1 のセグメント管理情報はブロック
毎の空き率を保持している事が確認できます。

では、続けて Level IIのブロックダンプ(26番目のブロック)の取得

alter system dump datafile 7 block 26;

Level II(SECOND LEVEL BITMAP BLOCK)の抜粋(自動セグメント領域管理)

ふむふむ。Level II のブロックが管理する Level 1 の情報を保持している
ようです。

  ↓ここから↓
  ********************************************************************
  Start dump data blocks tsn: 9 file#: 7 minblk 26 maxblk 26

  ~~

  frmt: 0x02 chkval: 0x46b9 type: 0x21=SECOND LEVEL BITMAP BLOCK

  ~~

  L1 Ranges :
  --------------------------------------------------------
   0x01c00019  Free: 5 Inst: 1 
  ********************************************************************
  ↑ここまで↑

取得したダンプの最後の行を見てください。

Level II のブロックが管理する Level 1 のブロックアドレスと空きブロッ
クがいくつあるかを保持しているようです。

今回は、セグメントヘッダにレベル分けして保持している情報がどのようにな
っているか見てきました。

次回は、一呼吸おいて従来のFREELIST管理について改めて復習する予定です。
ダンプの内容を覗く回が続きます。しばらくお付き合い下さい。

急に暖かくなってきました。
コートを着るか着ないか、毎朝迷う今日この頃。

桜満開まぢかの茅ヶ崎にて