フリーブロックに関する検証 その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 ちゃむ