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

<フリーブロックに関する検証  その8(最終回)>  ペンネーム  ちゃむ
今回で、~フリーブロックに関する検証~の最終回である。
以下の検証はフリーブロックに関連はするが、少し、横道にそれたものかもし
れない。

1.データファイルを複数もつテーブルスペースのエクステントの割当て方
2.フリーリストグループを指定したときのセグメントヘッダー

まずは、1.から検証する。
1_1.

TEST3Xというデータファイルを3つもつテーブルスペースを作成する。

create tablespace TEST3X
datafile '/export1/home1/oradata/test3a' SIZE 1M,
'/export2/home1/oradata/test3b' SIZE 1M,
'/export3/home1/oradata/test3c' SIZE 1M;

1_2.

テーブルを作成し、1500件インサートする。

/*db_block_size=2kの環境 t10man_orgはEMP表を10万件まで膨らませた表*/

create table dummy1  ( dm number)
tablespace TEST3X
storage (initial 2k next 2k pctincrease 0 maxextents unlimited);

insert into dummy1 select empno from t10man_org where rownum < 1501;

commit;

1_3.

ここで、dba_extentsを見てみよう。

select TABLESPACE_NAME, SEGMENT_NAME, EXTENT_ID, FILE_ID, BLOCK_ID, BLOCKS
from dba_extents where segment_name='DUMMY1'order by extent_id
TABLESPACE_NAME  SEGMENT_NAME  EXTENT_ID  FILE_ID  BLOCK_ID  BLOCKS
-------------------------------------------------------------------
TEST3X           DUMMY1        0          34       2         2
TEST3X           DUMMY1        1          32       26        1
TEST3X           DUMMY1        2          33       93        1
TEST3X           DUMMY1        3          34       69        1
TEST3X           DUMMY1        4          32       82        1
TEST3X           DUMMY1        5          33       39        1
TEST3X           DUMMY1        6          34       101       1
TEST3X           DUMMY1        7          32       85        1
TEST3X           DUMMY1        8          33       59        1
TEST3X           DUMMY1        9          34       21        1

ここで注目していただきたいのは、エクステントを割り当てるのに、データフ
ァイルFILE_ID 34,32,33の順に割り当てている点である。これは、オラクルが
自動的にデータを均等に分散してくれるためだ。

もし、明示的にこのデータファイルにアロケーションさせたいというニーズ
があれば、次のようにデータファイルを指定する。

alter table dummy1 allocate extent
(size 100k datafile '/export1/home1/oradata/test3a')

OPS(Oracle Parallel Server Option)では、事前にエクステントをアロケーシ
ョンさせておくことは、INSERTの激しく行われるテーブルでFreelistの競合を防
ぐための1つの方法である。その場合はされらに以下のようにinstance番号も指定
する。

alter table dummy1 allocate extent
(size 100k datafile '/export1/home1/oradata/test3a' instance 1)

OPSでは、テーブル作成時に指定するフリーリストグループが上記の事前アロ
ケーション同様非常に重要である。

ということで、2.の検証に移っていく。

2.フリーリストグループを指定したときのセグメントヘッダー

フリーリストグループは、OPS環境で、特にINSERTの多いテーブルにおいて、
インスタンス間のinsertを振り分けるために使用するものである。
フリーリストグループは、セグメントヘッダーにとられる。OPS環境ではこ
のセグメントヘッダーにアクセスが集中することがある。
今回はそのセグメントヘッダーがFREELIST GROUPによって何ブロック取られる
か見てみる。

/*db_block_size=2kの環境
minimum extent 2kで作成するのは、5ブロック単位の切り上げをさせないため*/

create tablespace TEST4a
datafile '/export/home1/oradata/test4a' SIZE 1M
minimum extent 2k;

/*freelist groupsをそれぞれ2,3,4で作成*/

create table dummy4_fg2  ( dm number)
tablespace TEST4a
storage (initial 2k next 2k pctincrease 0 freelist groups 2
maxextents unlimited);

create table dummy4_fg3  ( dm number)
tablespace TEST4a
storage (initial 2k next 2k pctincrease 0 freelist groups 3
maxextents unlimited);

create table dummy4_fg4_m2k  ( dm number)
tablespace TEST4a
storage (initial 2k next 2k pctincrease 0 freelist groups 4
maxextents unlimited);

DBA_EXTETNSから見てみると以下のようになる。

TABLESPACE_NAME  SEGMENT_NAME   EXTENT_ID  FILE_ID  BLOCK_ID  BLOCKS
--------------------------------------------------------------------
TEST4A           DUMMY4_FG2     0          36       2         4
TEST4A           DUMMY4_FG3     0          36       6         5
TEST4A           DUMMY4_FG4_M2K 0          36       11        6


freelist groups 1のときは、BLOCKSは2であったがfreelist groupsを複数
指定するとそれに応じて1ブロック別に取られることがわかる。

例えばDUMMY4_FG4_M2KのINITIALエクステントの中身は次のような構造になって
いる。

----------------------------------------------------------------------
SEGMENT    FREELIST    FREELIST    FREELIST    FREELIST     DATA
HEADER     GROUP 1     GROUP 2     GROUP 3     GROUP 4
1ブロック  1ブロック   1ブロック   1ブロック   1ブロック    1ブロック
合計 6ブロック
----------------------------------------------------------------------

ちなみに、minimum extent 0で作成した表領域にfreelist groups 4
のテーブルを作成してみるとどうなるであろうか。

/*minimum extent 0*/

create tablespace TEST4b
datafile '/export/home1/oradata/test4b' SIZE 1M;

/*freelist groups 4*/

create table dummy4_fg4_m0  ( dm number)
tablespace TEST4b
storage (initial 2k next 2k pctincrease 0 freelist groups 4
maxextents unlimited);

DBA_EXTENTSを見てみよう。TEST4Bは5ブロック単位で切り上げられるので、
10ブロック割当てられた様子がわかる。私は、これを避けたかったので、
上記の検証では、minimum extent=2Kを指定した。

TABLESPACE_NAME  SEGMENT_NAME   EXTENT_ID  BLOCKS
--------------------------------------------------
TEST4B           DUMMY4_FG4_M0  0          10      ←10ブロックに切り上げ
TEST4A           DUMMY4_FG4_M2K 0          6       ←切り上げのない様子

今回で、~フリーブロックに関する検証 ~は終了です。

せっかくのメールマガジン。領域管理の検証だけでは、面白くないと思います
ので、テーマを変えることにしました。
とりあえず「ちゃむ」はいったんお休み….。充電させていただきます。

今後、もっといい記事を書くために、やってほしいテーマや、今回のテーマだ
ったフリーブロックに関して「ここが良かった」、「ここが悪かった」という
意見があればどしどしいただきたいと思います。
また、いろいろな検証結果をひっさげて皆様にご紹介したいと思います。
約2ヶ月間、お付き合いしていただきましてありがとうございました。

以上  茅ヶ崎にて