ローカル管理表領域とディクショナリ管理表領域 - 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回作ったら見直すことなんて滅多に無いベー