フリーブロックに関する検証 その3

<フリーブロックに関する検証 その3>  ペンネーム ちゃむ

前回に引き続き、フリーブロックの検証をおこなう。コアレスをおこなうのは、
以下のタイミングである。
1.alter tablespace <テーブルスペース名> coalesce を発行したとき。
2.5分に一回smonが自動的に
(テーブルスペースのpctincrease 0以外を設定したテーブルスペースのみ)
3.pctincrease 0に設定したかしないに関わらず、コアレスしないとエクステン
トを割り当てる空領域が足りないとき

前回までに、1.2.に関して説明した。
今回は3.に関して検証を交えながら説明する。
3.を検証するために物理的に連続する20ブロックのフリーブロックを10個準
備した。これは、フリーブロック20ブロックごとにエクステント境界があるイ
メージである。

以下に、フリーブロックの状況を把握するSQL文とその結果を示す。フリーブ
ロックの状況を把握する際に用いるのがDBA_FREE_SPACEビューである。

SELECT TABLESPACE_NAME,BLOCK_ID,BYTES,BLOCKS
FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME='CRE20'
ORDER BY BLOCK_ID;
TABLESPACE_NAME  BLOCK_ID  BYTES  BLOCKS
----------------------------------------
CRE20            2         40960  20
CRE20            22        40960  20
CRE20            42        40960  20
CRE20            62        40960  20
CRE20            82        40960  20
CRE20            102       40960  20
CRE20            122       40960  20
CRE20            142       40960  20
CRE20            162       40960  20
CRE20            182       40960  20

物理的に連続しているのを判断できるのは、BLOCK_ID+BLOCKSが次の行のBLOCK_ID
になっているからである。
(例 1行目のBLOCK_ID=2 + BLOCKS=20が次の行のBLOCK_ID=22)

この状態で、create tableでinitial 30ブロック作るとフリーブロックの状態
は次のようになる。(db_block_size=2kならINITIAL 60kを指定)

TABLESPACE_NAME  BLOCK_ID  BYTES  BLOCKS
----------------------------------------
CRE20            2         40960  20
CRE20            52        20480  10 (BLOCK_ID 22~51までをINITIALとして確保)
CRE20            62        40960  20
CRE20            82        40960  20
CRE20            102       40960  20
CRE20            122       40960  20
CRE20            142       40960  20
CRE20            162       40960  20
CRE20            182       40960  20

この結果より、BLOCK_ID 22と42のエクステントをコアレスして、40ブロックの
空領域を作って、30ブロックのエクステントを表に確保した様子がわかる。
BLOCK_ID 52には10ブロックの空領域があるところから読み取れるだろう。
また、注目していただきたいのは、TABLESPACEすべてをコアレスしているのでは
なく、必要最低限のものだけ、つまり近隣エクステントをコアレスしている点で
ある。この状態でテーブルスペース全体のコアレスをするコマンドである
ALTER TABLESPACE <テーブルスペース名> COALESCE;をおこなうとどうなるであろ
うか。

TABLESPACE_NAME  BLOCK_ID  BYTES   BLOCKS
-----------------------------------------
CRE20            2         40960   20
CRE20            52        307200  150

BLOCK_ID 22から51の30ブロック分のテーブルが作成されたので、フリーブロ
ックが物理的に分断された様子が分かると思う。このことからいくらコアレス
しても、物理的に隣り合っていないフリーブロックは合体しないということが
わかる。

通常なら5分おきにsmonが行なっているコアレスの処理は一瞬で終了するが、
ひっきりなしにコアレスを行なっているサイトを見たことがある。大きいテー
ブルのtruncate処理やdrop table処理が多いサイトである。ひっきりなしにコ
アレスするということは、インスタンスに一つしか存在しないSTエンキューが
常に待ちの状態を繰り返す状態である。そのようなサイトではテーブルスペー
スにpctincrease 0を指定して、smonにコアレスさせないのもシステム全体の
負荷を削減するための一つの手である。
それが一つの手になりうるのは、今回のpctincrease 0に設定したかしないに関わ
らず、必要なとき内部的に近隣エクステントをコアレスする処理が備わっているか
らである。

以上 茅ヶ崎にて

~フリーブロックに関する検証 その3~
by ちゃむ