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