18 April, 1998 Updated
PCDN OracleWG S.Yamazaki
| データブロック、エクテント、セグメントの関係 |
|---|
Oracleにおいての記憶領域の単位は、データブロック、エクテント、セグメントの3つです。
データブロックは、I/Oの最小単位で、次にエクテント、その上位にセグメントが位置しています。その関係を表したのが、右図です。
これらの領域は、必ず一つの表領域内に位置づけられておりますが、複数の物理データ・ファイルに割り当てられる場合もあります。
また、セグメント内の各々のエクステントは連続して割り当てられている場合と、そうでない場合がありますが、各々のエクステントが含むデータは、必ず一つのデータ・ファイルに格納されます。
| データブロック |
|---|
データブロックの構成
データブロックは、各オペレーティング・システムにブロックサイズの倍数の単位によって構成されています。ここで説明するデータブロックとは、Oracleデータブロックで、オペレーティング・システムのブロックとは違うことを留意ください。
このデータ・ブロックの構成は以下のものにより構成されています。
データブロックの機能
データブロックに挿入または更新されるデータはPCTFREEとPCTUSEDの値によって制御されています。
これは、表領域を作成するとき、あるいは表(索引)を作成する場合に指定できる記憶領域パラメーターです。
次の一連の図は、PCTFREE値20%、PCTUSED値40%の時に、データブロック内でどのように機能しているかを表したものです。
図1 新規データの挿入
図3 削除、交信による行の長さの縮小
|
図2 更新による行の長さの増加
|
| エクステント |
|---|
エクステントの割当て
エクステントは複数の連続したデータ・ブロックの集合単位です。
表・索引(セグメント)を作成するときに初期エクステントが割り当てられます。最初に割り当てられた初期エクステントが満杯になり、さらに領域が必要となる場合に次のエクステントが動的に割り当てられます。
その関係を表したものが下図です。
エクステントのサイズは、表・索引を作成するときに指定する場合と、表・索引を変更する場合(初期エクステントは除く)に指定できます。 このエクテントサイズの指定と、Oracleが確保使用とする動作には若干の注意が必要となります。以下にOracleが連続したブロックを確保しようとする動作を示しましょう。これは、内断片化や自動拡張などに密接に関わる問題です、ぜひ理解していただきたいと思います(細かい制御までは説明しておりませんので、そちらはマニュアル等をご覧ください)。
次に必要とされるエクステントサイズが10ブロックだった場合。
このことから、5ブロック未満の空き領域は存在しないことがわかります。
また、例え総空き容量が、必要とされるブロック数より多い場合でも、連続していない場合などはファイルサイズが拡張されることがあることに注意してください。
エクステントの解放
割り当てられたエクステントは、例えデータが格納されていなくても、他のオブジェクトによって利用されることはありません。
割り当てられたエクステントを解放して表領域に戻して再利用されるようにするには、以下のような動作(DDL文)が必要です。
この他、ロールバック・セグメントでOPTIMAL SIZEを指定していた場合でも、最適化される都度、解放されることがあります。
| セグメント |
|---|
セグメントは、1つ以上のエクステントの集合と言えます。表には表データが入っているエクステントの集合が割り当てられ、また、索引には索引データが入っているエクステント集合が割り当てられています。
セグメントのタイプには、データセグメント・索引セグメント・一時セグメント・ロールバックセグメントの4つがあります。以降、一つ一つ簡単に説明していきます。
データセグメント
このセグメントとしては、TABLE,CLUSTER,SNAPSHOT,SNAPSHOT LOGがあります。
セグメントは、CREATE {TABLE (PARTITION)|CLUSTER} によって作成され、エクステントの割当ては、直接STORAGE句の記憶領域パラメーターで指定できます。
索引セグメント
このセグメントは、その名の通り、表に関連されている各索引です。
セグメントは、CREATE INDEX文によって作成され、エクテントはデータセグメントと同じく、直接STORAGE句で指定できます。
一時セグメント
このセグメントは、一時記憶領域を必要とする以下のような(ディスクソートを必要とするような)場合に作成されます。
ロールバックセグメント
ロールバックセグメントには、最低2つのエクステントが割り当てられています。
少しトランザクションに関係した説明になりますが、1つのトランザクションは、ロールバックセグメントに循環方式で情報の書込みを行います。また、1つのトランザクション情報は1つのエクステントにのみ書込まれ、1つのエクテントには複数のトランザクション情報を書込むこともできます。ただし、1つのデータブロックには1つのトランザクションしか書込みません。
先のエクステントのところで説明したとおり、ロールバックセグメント内のエクステントの解放は、OPTIMALサイズが指定されている場合、その最適サイズと現在のサイズを比較しながら、アクティブでないトランザクション情報のあるエクステントを解放しようと試みます。
このロールバックセグメントの説明をするには、少しページが足りません。ここでは、これくらいにして詳しくは「トランザクション制御」で詳しく述べたいと思います。