フリーブロックに関する検証 その6
<フリーブロックに関する検証 その6> ペンネーム ちゃむ
前回に引き続きフリーブロックの領域をテーブルなどのオブジェクトが使用
するときの領域の割り当て方に迫ってみる。
1.minimum extentに関して<前回説明>
2.フリーブロックの断片をなるべく残さないような動き
3.フリーブロックをどのよう使うかを表わしたフローチャート<次回以降説明>
今回は、2の説明を行う。フリーブロックの断片をなるべく残さないような動
きとはいったいどのような動きであろうか?はじめに、検証結果からご覧いた
だきたい。
「オラクルは、5ブロック以下の空きエクステントを残さないように領域を割り
当てる。」
マニュアルでは、5ブロック未満とあるが、わたしが行なった検証では5ブロック
以下である。(バージョン7.3.2以上において検証実施)
では、さっそく、5ブロック以下の領域が残されないように割り当てる様子を見
てみよう。
/*フリーブロック105のテーブルスペースを領域を作る*/
create tablespace cre20 datafile '../shome/share/cre20.ora' SIZE 212k default storage (pctincrease 0);
(注意:データファイルの先頭には必ず1ブロックのヘッダーが存在する)
その領域にINITIAL 10ブロックのテーブルを10ブロック×9エクステントアロ
ケーションさせる。
create table cre20 (col1 number) tablespace cre20 storage(initial 20k next 20k pctincrease 0); alter table cre20 allocate extent (size 20k); alter table cre20 allocate extent (size 20k); alter table cre20 allocate extent (size 20k); alter table cre20 allocate extent (size 20k); alter table cre20 allocate extent (size 20k); alter table cre20 allocate extent (size 20k); alter table cre20 allocate extent (size 20k); alter table cre20 allocate extent (size 20k); alter table cre20 allocate extent (size 20k);
では、dba_extentsビューを見てみよう。
SEGMENT_NAME EXTENT_ID BLOCK_ID BYTES BLOCKS ------------------------------------------------ CRE20 0 2 20480 10 CRE20 1 12 20480 10 CRE20 2 22 20480 10 CRE20 3 32 20480 10 CRE20 4 42 20480 10 CRE20 5 52 20480 10 CRE20 6 62 20480 10 CRE20 7 72 20480 10 CRE20 8 82 20480 10 CRE20 9 92 30720 15 ←注目
ここで、EXTENT_ID 9 BLOCK_ID 92のエクステントに注目していただきたい。
10ブロックアロケーションするはずのものが15ブロック割り当てられている。
create tablespace cre20 datafile '../shome/share/cre20.ora' SIZE 214k default storage (pctincrease 0);
上記のように106ブロックのフリーブロックのテーブルスペースを作ったら、
上記のdba_extentsはすべて10ブロック割り当てられた。
なぜなら6ブロック以上のフリーブロックはオラクルが断片化とは判断しない
ためだ。
では、本当にすべての場合においてそうなのか?
以下の2つの異なった条件で本当に5ブロック以下はフリーブロックを残さ
ないように動くかを検証する。
2_1.create tablespaceで空きスペースが5ブロック以下になるようなSIZE
を指定したとき
2_2.minimum extentを変更したとき
2_1.はあまり面白い検証ではないが、もしかしたら、5ブロック以下のテー
ブルスペースを作るとエラーが発生することもあるのではないかと思い、念の
ためにやってみた。結果は以下のとおりである。
以下に1ブロックから5ブロックのtablespaceを作った直後のdba_free_space
ビューを検索したものである。
TABLESPACE_NAME BLOCK_ID BYTES BLOCKS ---------------------------------------- CRE1L 2 2048 1 CRE2L 2 4096 2 CRE3L 2 6144 3 CRE4L 2 8192 4 CRE5L 2 10240 5
結果は、上記のとおり特にエラーは発生せずに5ブロック以下のフリースペー
スは作れた。これは、例外的な結果としておさえていただきたい。
次に2_2.である。minimum extentはアロケーションする単位を決めるもので
ある。したがって、検証方法は、先程とほとんど同様で違いはminimum extentを
変更しただけである。
/*db_block_size=2kの環境
フリーブロックが105ブロックできるようにSIZE 212kでテーブルスペースを作成*/
create tablespace min0 datafile '../shome/share/min0.ora' SIZE 212k default storage (pctincrease 0); create tablespace min1 datafile '../shome/share/min1.ora' SIZE 212k minimum extent 2k default storage (pctincrease 0); create tablespace min10 datafile '../shome/share/min10' SIZE 212k minimum extent 20k default storage (pctincrease 0);
この後は、同様に、それぞれのテーブルスペースにinitial 10ブロック
のテーブルをつくり、alter table <テーブル名> allocate extent (size 20k);
で9回エクステントをアロケーションさせる。結果は以下のとおりである。
やはり、それぞれ最後のアロケーションで15ブロック割り当てられている。
どれも、先程と同様の結果である。結果は載せていないが、先程と同様はじめ
にフリーブロックを106ブロックのテーブルスペースのときは、すべて10ブロ
ックずつ割り当てられ、11個目で割り当てれない状態になった。この検証から
「minimum extentがいくつかに関わらず、オラクルは、5ブロック以下の空きエ
クステントを残さないように領域を割り当てる。」といえる。
SEGMENT_NAME TABLESPACE_NAME EXTENT_ID BYTES BLOCKS ------------------------------------------------------- MIN0 MIN0 0 20480 10 MIN0 MIN0 1 20480 10 MIN0 MIN0 2 20480 10 ....................................................... MIN0 MIN0 7 20480 10 MIN0 MIN0 8 20480 10 MIN0 MIN0 9 30720 15 ←どれも同様 MIN1 MIN1 0 20480 10 MIN1 MIN1 1 20480 10 MIN1 MIN1 2 20480 10 ....................................................... MIN1 MIN1 7 20480 10 MIN1 MIN1 8 20480 10 MIN1 MIN1 9 30720 15 ←どれも同様 MIN10 MIN10 0 20480 10 MIN10 MIN10 1 20480 10 MIN10 MIN10 2 20480 10 MIN10 MIN10 3 20480 10 ....................................................... MIN10 MIN10 7 20480 10 MIN10 MIN10 8 20480 10 MIN10 MIN10 9 30720 15 ←どれも同様
次回もminimum extentに関してもう少しだけ説明する。
以上 茅ヶ崎にて