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

<フリーブロックに関する検証  その4>  ペンネーム  ちゃむ
今回はフリーブロックの領域をテーブルなどのオブジェクトが使用するときの
領域の割り当て方にさらに迫ってみる。では、以下の内容に関して順番に説明
しよう。

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

では1.に関して説明する。minimum extentとは簡単にいうと領域管理の単位
をそこで指定したバイト単位で、つまりはブロック単位でおこなうために使用さ
れる。これは、8.0からのバージョンで使用できるようになったものである。

(1) 具体的な例で見ていこう。
以下は、create tablespaceをおこなうときにバイト単位で指定するものである。
ここでは,db_block_size=2kを指定しているため80K/2K=40ブロック(単位)で領
域管理を行うように指定した。

create tablespace test datafile
'/shome/share/koba/oradata/test.ora' SIZE 880k
minimum extent 80k
default storage (pctincrease 0);

(2) このテーブルスペースにテーブルCHAMUを作ってみる。

CREATE TABLE CHAMU (COL1 NUMBER) TABLESPACE TEST
STORAGE (INITIAL 2K NEXT 2K PCTINCREASE 0 MINEXTENTS 5);

1ブロックのエクステントを5個作ってくれという命令であるが、結果はどうなる
であろうか?

DBA_EXTENTSを見てみよう。

SEGMENT_NAME  TABLESPACE_NAME  EXTENT_ID  BLOCK_ID  BYTES  BLOCKS
-----------------------------------------------------------------
CHAMU         TEST             4          2         81920  40
CHAMU         TEST             2          42        81920  40
CHAMU         TEST             0          82        81920  40
CHAMU         TEST             1          122       81920  40
CHAMU         TEST             3          162       81920  40

2Kバイト(1ブロック)のエクステントを指定したにも関わらずエクステントは
40ブロック単位となっている。minimum extentで指定した40ブロック単位で領域
は割り当てられてしまっている。

(3)このときの、テーブルスペースのフリーブロックをDBA_FREE_SPACEで見てみよう。

TABLESPACE_NAME  BLOCK_ID  BYTES   BLOCKS
-----------------------------------------
TEST             202       489472  239

239ブロック空いている状況がわかるが、40ブロック*6に満たない。つまり、
あと5エクステント分しかエクステントされない。MINIMUM EXTENTを変更しない
限りは、39ブロックは、まったくの未使用領域になってしまう。

(4)CREATE TABLESPACE でデータファイルのSIZEを880Kで指定しているが、これを作
った直後のフリーブロックの様子は以下のとおりである。

TABLESPACE_NAME  BLOCK_ID  BYTES   BLOCKS
-----------------------------------------
TEST             2         899072  439

(880K/2K) – (ヘッダー1ブロック) = 439ブロック である。データファイルのヘッ
ダーに1ブロック使用されるので、minimum extent 80k の場合にはヘッダー分を考
慮してデータファイルの大きさをSIZE 882kで指定するほうが無駄な領域を作らない
ことがわかる。

参考までに、データファイルのヘッダーのダンプを出力するコマンドは、

ALTER SESSION SET EVENTS 'IMMEDIATE TRACE NAME FILE_HDRS LEVEL 10';

である。初期化パラメータの user_dump_destにトレースファイルとして出力される。

領域管理の利点からminimum extentを考えてみよう。
例えば、minimum extent 100kで指定した表領域にテーブルを格納するとしよう。
そのとき、DROP TABLE、CREATE TABLE、TRUNCATE TABLEなどが頻繁に行われるとき
領域の管理単位が決まっていると、非常に効率よく領域の解放、確保を行なうこと
ができる。この場合だと断片化したとしても100K単位であり、再利用できるサイズで
あることが理解できるだろう。この話は、「その3」の☆★Question1★☆の回答
の中でも、取り扱ったので、また、読み返してみていただきたい。

minimum extentのサイズを決める指針は、領域を解放するオブジェクトのサイズに注
目するのがよいであろう。日常の業務処理で領域を解放するのは、以下のものがあげ
られるのではないだろうか。

・ある処理をするために中間的に作った表
・REBUILDやDROP AND CREATEなどを頻繁に行なう索引の表領域
・日付をキーにしたパーティション表の古い日付データのDROP

これらのオブジェクトのサイズに注目して、その解放が行なわれる単位を把握した上で、
minimum extentのサイズを決定すべきであろう。

あくまでも、DELELE処理では、領域は解放されないので、注意していただきたい。

以上  茅ヶ崎にて

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