> Q.CREATE TABLE文実行時に以下のエラーが発生します。
>
> -------------------------------------------------
> ORA-03237:
> 指定サイズのINITIALエクステントは表領域(TS1)に
> 割当てできません。
> -------------------------------------------------
>
> 調査をした結果、以下の動作を確認しました。
> ・表領域(TS1)の空き領域は十分である。
> ・LOB列が含まれており、LOB列の定義を外すと、正常終了した。
> ・エラーが発生するのは9i環境で、8i環境では発生しません。
この現象は、LOB列と8iでは発生しないという事がポイントです。
まず、Oracleの仕様として、LOB列の場合は、db_block_size * 3
のサイズを1エクステント内に収める必要があります。
例えば、db_block_sizeが16Kである場合、LOB列を使用する為には、
16K*3=48Kのエクステントが必要となります。(1エクステントのサイズで)
では、表領域には、十分な空き領域があるにも関わらず、
何故1エクステントで48Kが確保できなかったのか???
理由は1つ。
ローカル管理表領域のエクステント管理方式としてUNIFORM方式を使用し、
そのUNIFORMサイズが48Kより小さかったから!
でしょうね。
UNIFORM方式の場合は、エクステントサイズは固定となるので、
1エクステントのサイズは全て固定となります。
なので、そのサイズが小さかった為に、LOBの仕様である、
db_block_size * 3 のエクステントが確保出来なかったのでしょう。
表領域をその他の方式とした場合は、以下の理由により、エラーは発生しません。
まず、ローカル管理表領域のもう一つの方式である、AUTO ALLOCATE の場合、
エクステントのサイズはOracleによって自動的に決定されるので、問題なし。
(セグメントサイズに従い64KB、1MB、8MB、64MBのエクステントを自動で確保)
もう一つ、ディクショナリ管理の場合。
この場合は、オブジェクト作成時にSTORAGE句に指定した値が使用されるので、
こちらもエラー発生は防止できます。
Oracle8iまでは、デフォルトの管理方式がディクショナリ管理であり、
それを利用していた為、8i環境ではエラーが発生しなかったのでしょう。
尚、UNIFORMサイズの変更を行うには、表領域を再作成しなくてはいけません。