ユーザーが作成する表はどこに格納されるのでしょう?作成時にはどのくらいの大きさで作られるのでしょう。その領域がいっぱいになったら追加の領域が自動的に割り当てられるのでしょうか?だとしたら,最初の領域,追加の領域に呼び名はないのでしょうか?今回は,そんなことを明確にしましょう。

記憶領域の管理構造を理解する

 データベースには,「表領域」という,記憶領域を管理する単位があります。表や索引は1つの表領域の中に作成されます。1つの表や索引が異なる表領域にまたがって作成されることはありません。

 表領域は論理的な単位です。表や索引が物理的に格納されているのは,表領域に対応付けられている「データファイル」です(図1)。

図1●記憶領域の管理構造
図1●記憶領域の管理構造

 表領域は,複数のデータファイルから構成される場合があります。しかし,一つのデータファイルが異なる複数の表領域にまたがって対応付けられることはありません。

 表や索引を作成すると,「初期(第1)エクステント」が割り当てられます。エクステントとは,連続した「データブロック」です。データブロックは,OracleにおけるI/Oの最小単位で,標準のブロックサイズは,DB_BLOCK_SIZE初期化パラメータで定義されています。データブロックは,実際には複数の「OSブロック」(OSのファイルシステムの最小単位)で構成されています。

 表や索引は,初期エクステントに行を挿入し,いっぱいになったら追加のエクステントを割り当てます。初期エクステントと追加のエクステントは物理的に隣接している場合もあれば,全く別の場所に割り当てられることもあります。例えば,表領域内の異なるデータファイルに,エクステントが分散される場合があります。エクステントは,連続した領域でなければいけないので,一つのエクステントが,異なるデータファイルにまたがることはありません。

 なお,索引オブジェクトが割り当てられている領域を「索引セグメント」と呼び,表オブジェクト(LOB=Large Object列は含まず)が割り当てられている領域を「データセグメント」と呼びます。つまり,セグメントは複数のエクステントから構成され,一つの表領域に格納されます。セグメントは複数のデータファイルにまたがっている場合があります(図2)。

図2●セグメント,エクステント,データファイルの関係
図2●セグメント,エクステント,データファイルの関係