ディクショナリ管理表領域とは
ディクショナリ管理表領域とは、ディクショナリによる表領域管理は領域管理を内部テーブル
(ディクショナリ)にて行っていることに由来する。
Oracle 9i 以降ならば、あえて選択することも少ないと思われる 表領域 の形式である。
正しく設計および運用をしていない場合には ST エンキュー による
レスポンスの悪化の可能性もあるので注意が必要である。
ソフトウェアに制限 (COMPATIBLE 初期化パラメータ) がある、更新処理のほとんどがダイレクト・パス・インサートによる処理など。
特別な理由がない場合には ローカル管理表領域 の方がトータルでパフォーマンスが良い。
エクステントの獲得
ディクショナリ管理表領域でのエクステント獲得のステップ
- エクステントのブロック数の調整
5 ブロック未満の場合はそのまま(ブロック単位切上げ)、5 ブロックを超える場合には 5 ブロック単位に切上げ
これを確保するブロック数とする。
- 空き領域の検索と拡張
増分エクステントは FET$, FILE$ を 要求されたブロックサイズで検索する。
存在しない場合には、要求ブロック以上の大きな空きブロックを検索する。
(余剰分が +5 ブロックを超えるエクステントの場合は分割処理され、余剰分の空き領域が生成される)
まだ拡張できない場合には、空き領域を コアレス し、上記 2 つをリトライする。(負荷の高い処理)
それでも存在しない場合には、テーブルスペースを拡張する。(負荷の高い処理)
- 割り当て
FET$, FILE$ に 割り当て情報を格納する。
エクステントが以前に使用済み領域の場合には、フォーマットを行う。
エクステントの解放
FET$, FILE$ に エクステント単位に空き領域として登録される。
コアレス は SMON によりテーブルスペース単位に定期的 (5分) に自動で行われる。
PCTINCREASE が 0 のテーブルスペースは対象とならない。Tips *1
コアレスは、断片化が大量に発生している場合 ST エンキュー を伴いシステムに影響のでるほどコストの高い処理となる。
また、コアレスは断片化が激しいときは一度にすべての空き領域を結合できない。
何度もコアレスすることで、より大きな結合がされて最後に完全に結合される。
コアレスを手動実行するには
ALTER TABLESPACE fragment_tablesapce COALESCE ;
エクステント数が多いときの注意点
同じテーブルでエクステントの獲得を何度(数百、数千)も行うと内部テーブルには大量のレコードが生成される。
それを取得する DML の処理が少しだけ遅くなる。
また、テーブルの領域解放を伴う (TRUNCATE / DROP) 処理も低下する。
通常の場合、それも数分に至るようなことはない(数千以上のエクステント数のオーダなら自信はない=設計に問題あり)。
しかし、この解放操作の間のロック中は該当表領域へのいかなる操作も行なうことができない。
そして ST エンキューの作業中には データ・ディクショナリ を高負荷で大量に書き換えている。
そのため処理が遅いからといって、この操作を ALTER SESSION KILL で強制終了したり shutdown abort や
電源オフは非常に危険である。
ほとんどないとは言っても クラッシュ・リカバリ が完全にできずにデータベースが壊れる危険性
を高めるような操作は特別な事情がない限り行なってはいけない。
エクステント数の目安
ディクショナリ管理の場合、大量にエクステント処理が発生しないように領域設計をしっかり行なう必要がある。
一般的な要件であれば、エクステント数は 100〜200 を超えないようなオーダになるように注意したい。
上限は 約 2億エクステント。もし数十、数百億レコードもあるような 2 億エクステントのテーブルが存在したとして、
そのテーブルに TRUNCATE や DROP したときには ST エンキューから解放されるまで
数日間ディスクが延々とうなり続け、シャットダウンもできない状態というのもあるかもしれない。
一桁のエクステントの格納に執着する必要はない
あまり考える必要もない場合には、1 エクステントで拡張なしという解決策はよくある。
一桁台のエクステント数に、こだわり EXP/IMP 頻繁に繰り返すことは、時間と労力の無駄になる。
エクステントはファイルを、またげない。
パーティショニングができない Oracle SE(WG) においては
TABLE の MINEXTENTS 2 以上にすることで DiskIO を分けることは性能を高める手法である。
但し、物理ディスクが 2台以上(複数スピンドル)あること。パーティション(ドライブ番号)の違いでは意味がない。