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

<フリーブロックに関する検証  その5>  ペンネーム  ちゃむ
前回に引き続き、フリーブロックの領域をテーブルなどのオブジェクトが使用
するときの領域の割り当て方に迫ってみる。

1.minimum extentに関して
2.フリーブロックの断片をなるべく残さないような動き<次回以降説明>
3.フリーブロックをどのように使うかを表わしたフローチャート
<次回以降説明>

1.の説明を引き続きおこなう。もし、minimum extentをcreate tablespace
のときに指定しなかったらdefault 0になる。このときの動きを見ていこう。

db_block_size=2kの環境でテーブルスペースTESTをminimum extent指定なしで
つくり、dummy1というテーブルを
テーブルスペースTESTにINITIAL 2K(1ブロック)で作成し、以下の
alter table文を100個実行してみる。
これは、指定したサイズだけエクステントをアロケーションさせるためのコマ
ンドである。

alter table dummy1 allocate extent (size 2k); 1ブロックエクステント
alter table dummy1 allocate extent (size 4k); 2ブロックエクステント
alter table dummy1 allocate extent (size 6k); 3ブロックエクステント
..............................................
alter table dummy1 allocate extent (size 196k); 98ブロックエクステント
alter table dummy1 allocate extent (size 198k); 99ブロックエクステント
alter table dummy1 allocate extent (size 200k); 100ブロックエクステント

dba_extentsビューを検索してみると結果はどうであろうか?

SEGMENT_NAME  EXTENT_ID  BLOCK_ID  BLOCKS
-----------------------------------------
DUMMY1        0          2         2     ←はじめのinitial extent
DUMMY1        1          4         1     ←next 1ブロック
DUMMY1        2          5         2     ←next 2ブロック
DUMMY1        3          7         3     ←next 3ブロック
DUMMY1        4          10        4     ←next 4ブロック
DUMMY1        5          14        5     ←next 5ブロック
DUMMY1        6          19        10    ←next 6ブロックなのに
DUMMY1        7          29        10
DUMMY1        8          39        10
DUMMY1        9          49        10
DUMMY1        10         59        10
..........................................
DUMMY1        91         4269      95
DUMMY1        92         4364      95
DUMMY1        93         4459      95
DUMMY1        94         4554      95
DUMMY1        95         4649      95
DUMMY1        96         4744      100
DUMMY1        97         4844      100
DUMMY1        98         4944      100   ←next 98ブロックなのに
DUMMY1        99         5044      100   ←next 99ブロックなのに
DUMMY1        100        5144      100   ←next 100ブロック

ここでまず注目してもらいたいのが、initialで2k(1ブロック)としていたのに、
2ブロックとられている。これは、セグメントヘッダーの領域が、テーブルに1
ブロック取られることを意味している。すべてのテーブルには、必ずセグメント
ヘッダー1ブロックを取られるので、initialは必ず2ブロック以上は取られる。
その次のnextで1ブロックアロケーションさせたときにはちゃんと1ブロックだけ
が割り当てられたこともあわせて確認していただきたい。

次に、6ブロックエクステントをアロケーションしたところに注目していただき
たい。実際には10ブロック割り当てられている。それ以降も、5ブロック単位で
切り上げられて割り当てられている様子を確認できるだろう。
1~5ブロックまでは指定したサイズでエクステントがアロケーションされるが、
6ブロック以上だと5ブロック単位で切り上げれることが読み取れるだろう。

これは、上記のalter tableのallocate extent だけでなく,insertした結果、エ
クステントがいっぱいになり、次のエクステントを割り当てるとき(データが
増えてエクステントが発生するとき)にも、今回の結果と同様のアロケーション
のされ方になる。

また、pctincreaseを指定したときにも5ブロック切り上げは、当てはまる。
但し、増分の計算方法の端数の切り上げと5ブロック単位の切り上げの順番に
注意していただきたい。(「その2」のQAの回答でもある)

db_block_size=2kの環境

create table cre1 (col1 number)
storage(initial 100k next 100k pctincrease 50 minextents 10);

dba_extentsを参照

SEGMENT_NAME  EXTENT_ID  BLOCKS
-------------------------------
CRE1          0          50    intial
CRE1          1          50    next
CRE1          2          75    50 *1.5=  75.0を5ブロック単位で切り上げ
CRE1          3          115   75 *1.5= 112.5を5ブロック単位で切り上げ
CRE1          4          170   113*1.5= 169.5を5ブロック単位で切り上げ
CRE1          5          255   170*1.5= 255.0を5ブロック単位で切り上げ
CRE1          6          385   255*1.5= 382.5を5ブロック単位で切り上げ
CRE1          7          575   383*1.5= 574.5を5ブロック単位で切り上げ
CRE1          8          865   575*1.5= 862.5を5ブロック単位で切り上げ
CRE1          9          1295  863*1.5=1294.5を5ブロック単位で切り上げ

以上  茅ヶ崎にて

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