フリーブロックに関する検証 その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に関してもう少しだけ説明する。

以上  茅ヶ崎にて