今回はオラクルDBの表領域を構成するデータファイルの最小サイズの調査。

概要


ちょっと原点回帰ということで、表領域、セグメント、エクステント、ブロック、というデータ構造の部分を復習。 表領域を作成する際に、最小サイズで作成できれば色々とブロック周りの実験(行移行、行連鎖、セグメント、エクステントの動きの調査など)がしやすいのではと思ったのがきっかけ。

オラクルのデータ構造はざっくりと

  • 最小単位:ブロック
  • ブロックをまとめたもの:エクステント
  • エクステントをまとめたもの:セグメント
  • セグメントをまとめたもの:表領域

となっている。まぁ、ちょっと複雑。

ということで

最小単位であるところのブロックのサイズで表領域を作成すれば

セグメント=エクステント=ブロック

となり、大変シンプルでデータ構造を理解するのが楽になるのではないかと思った。

しかして、例えばブロックサイズ8KBの場合に8KBで表領域が作成できず

じゃあデータファイルの最小サイズっていくつなの?

ということで実験した。

環境


oracle 12c ( Single Instance )

表領域の作成


ブロックサイズは8KBとして表領域を作成する。

まずはデータファイルサイズを8KBで作成を試みる。

SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 8k;
create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 8k
*
1でエラーが発生しました。:
ORA-03214: 指定したファイル・サイズが必要最小値を下回っています。

SQL>

やはりダメの様子。続いてなんとなく10倍の80KBにして挑戦。

SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 80k;
create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 80k
*
1でエラーが発生しました。:
ORA-03214: 指定したファイル・サイズが必要最小値を下回っています。

むむ。80KBでもダメ。ならば100KBではというと。。。

SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 100k;

表領域が作成されました。

100KBだと作成できるみたい。

というわけで100KBから80KBの間で二分探索法の要領で最小サイズを調べていく。


-- 作成された表領域の削除
SQL> drop tablespace TEST_TBLSP including contents and datafiles;

表領域が削除されました。

-- ( 100 + 80 ) / 2 = 90KB
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 90k;

表領域が作成されました。

SQL> drop tablespace TEST_TBLSP including contents and datafiles;

表領域が削除されました。

-- ( 90 + 80 ) / 2 = 85KB
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 85k;

表領域が作成されました。

SQL> drop tablespace TEST_TBLSP including contents and datafiles;

表領域が削除されました。

-- ( 85 + 80 ) / 2 = 82KB
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 82k;

表領域が作成されました。

SQL> drop tablespace TEST_TBLSP including contents and datafiles;

表領域が削除されました。

-- 81KB
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 81k;

表領域が作成されました。

SQL>

結果、81KBが表領域作成の際の最小サイズであることが分かった。 うーむ。8KBのブロックサイズなのに8KBの倍数のサイズじゃないのが不思議。

また、ブロックサイズを大きくすると最小サイズも変わるのかを試してみる(16KBで調査してみる)。


-- 16KB用のキャッシュサイズの設定
SQL> show parameter db_16k

NAME				     TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
db_16k_cache_size		     big integer
0
SQL> alter system set db_16k_cache_size=10m;

システムが変更されました。

SQL> show parameter db_16k

NAME				     TYPE
------------------------------------ ---------------------------------
VALUE
------------------------------
db_16k_cache_size		     big integer
16M


-- 81KBで作成を試みる
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 81k blocksize 16k;
create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 81k blocksize 16k
*
1でエラーが発生しました。:
ORA-03214: 指定したファイル・サイズが必要最小値を下回っています。

失敗した。やはりブロックサイズが大きくなるとデータファイルの最小サイズも大きくなるっぽい。つづけて同様に調査する。


-- 100KB : ok
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 100k blocksize 16k;

表領域が作成されました。

SQL> drop tablespace TEST_TBLSP including contents and datafiles;

表領域が削除されました。

-- ( 100 + 81 ) / 2 = 90KB : NG
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 90k blocksize 16k;
create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 90k blocksize 16k
*
1でエラーが発生しました。:
ORA-03214: 指定したファイル・サイズが必要最小値を下回っています。

-- 95KB : NG
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 95k blocksize 16k;
create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 95k blocksize 16k
*
1でエラーが発生しました。:
ORA-03214: 指定したファイル・サイズが必要最小値を下回っています。

-- 97KB : OK
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 97k blocksize 16k;

表領域が作成されました。

SQL> drop tablespace TEST_TBLSP including contents and datafiles;

表領域が削除されました。

-- 96KB : NG
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 96k blocksize 16k;
create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 96k blocksize 16k
*
1でエラーが発生しました。:
ORA-03214: 指定したファイル・サイズが必要最小値を下回っています。


97KBが最小っぽい。一応、念のためキャッシュサイズが影響を及ぼさないことを確認しておく。


-- キャッシュサイズを10m => 100mに変更
SQL> alter system set db_16k_cache_size=100m;

システムが変更されました。

-- 96KB : NG
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 96k blocksize 16k;
create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 96k blocksize 16k
*
1でエラーが発生しました。:
ORA-03214: 指定したファイル・サイズが必要最小値を下回っています。

-- 97KB : OK
SQL> create tablespace test_tblsp datafile '/tmp/test_tblsp.dbf' size 97k blocksize 16k;

表領域が作成されました。

キャッシュサイズの値は関係なく、ブロックサイズが16KBの場合は最小データファイルサイズは97KBっぽい。

まとめ


表領域を作成する際の最小のデータファイルのサイズは実験の結果

  • 8KBの場合:81KB
  • 16KBの場合:97KB

であった。

また、最小データファイルサイズに関する発見は

  • 単純にブロックサイズの倍数ではないこと
  • いずれの場合も1KBプラスされていること

であった。

表領域やデータファイルについては最大に関する情報はあるものの、最小についての情報が見当たらなかったため調査した。

蛇足


実際のデータファイルのサイズはこれまた違う。


# 81KBの表領域を作成した場合のデータファイルのOS上のサイズ
[oracle@test1 ~]$ du -sh /tmp/test_tblsp.dbf
96K	/tmp/test_tblsp.dbf

## せっかくなので作成したデータファイルの中身も見てみた
[oracle@test1 ~]$ strings /tmp/test_tblsp.dbf
}|{z
TESTDB
TEST_TBLSP
[oracle@test1 ~]$