ねもぷらす

ふぁいんでぃんぐねもの日記。プログラミングとか育児とか

ローカル管理表領域とディクショナリ管理表領域 - CREATE TABLESPACE

9iから明示的に指定しなければローカル管理表領域が使用される。
ただしSYSTEM表領域がローカル管理の場合、ディクショナリ管理は使用できない。


以下は合計100Mのテーブルを格納できる表領域を作成する CREATE TABLESPACE 文。
この表領域に作成するテーブルについて、CREATE TABLE で STORAGE 句を指定しない場合に DEFAULT STORAGE で指定した値が適用される。
で、ここの NEXT と MINEXTENTS の扱いで混乱したのでメモを残しておく。

ローカル管理表領域

CREATE TABLESPACE 表領域名
  DATAFILE "c:\oradata\表領域データファイル. dbf" SIZE 100M
  EXTENT MANAGEMENT LOCAL
  DEFAULT STORAGE(
    INITIAL 100K
    NEXT 100K
    MINEXTENTS 1
    MAXEXTENTS 100
    PCTINCREASE 10);

ディクショナリ管理表領域

CREATE TABLESPACE 表領域名
  DATAFILE "c:\oradata\表領域データファイル. dbf" SIZE 100M
  EXTENT MANAGEMENT DICTIONARY
  DEFAULT STORAGE(
    INITIAL 100K
    NEXT 100K
    MINEXTENTS 1
    MAXEXTENTS 100
    PCTINCREASE 10);

ローカル管理での INITIAL とか NEXT とか

ディクショナリ管理は廃れていく仕様っぽいのでスルー。1つのファイルにビットマップを形成してくれるローカル管理表領域の方がメリットが多いらしいです。
で、NEXT、MINEXTENTS、MAXEXTENTS はディクショナリ管理で効果を発揮する設定値なので、ローカル管理を使う以上設定は無意味なモノ。

例えば NEXT(テーブルサイズが INITIAL を超えそうなときに次に確保するデータサイズ)を 100K とか設定しても、作成後に USER_ALL_TABLES を確認してもNEXT_EXTENT は NULL のまま。
NEXT が空だと INITIAL のサイズ以上にデータを格納できないんじゃ?!と焦ったけどそんなことはなく、Oracle先生の管理によってテーブルサイズは拡張されていました。
表領域のサイズは拡張されないので、適宜 ALTER 文を発行してリサイズのこと。

ALTER DATABASE DATAFILE "c:\oradata\表領域データファイル. dbf" RESIZE 200M


MINEXTENTS が設定されると、INITIAL の設定値 + (NEXTの設定値 × MINEXTENTSの設定値) で計算された結果が INITIAL として設定される。
だったら最初から INITIAL に入れておけば良いし。。
MAXEXTENTS も1ファイルでセグメントを管理するローカル管理においては何を設定しても Unlimited 扱いとなるので設定は無意味。



というメモを遠い日の自分に残す。表領域とか1回作ったら見直すことなんて滅多に無いベー