2.2.3 DBエリアの物理構造

DBエリアは,ページセグメントという単位から構成されています。DBエリアの物理構造を次の図に示します。

図2-2 DBエリアの物理構造

[図データ]

このようにDBエリアは複数のセグメントから構成されています。セグメントは複数のページから構成されています。

<この項の構成>
(1) セグメント
(2) ページ

(1) セグメント

セグメントは,表やインデクスのデータを格納するときの最小単位です。そのため,一つのセグメントに複数の表,または複数のインデクスを格納することはできません。セグメントと表,インデクスの関係を次の図に示します。

図2-3 セグメントと表,インデクスの関係

[図データ]

参考
作業表用DBエリアは,ほかのDBエリアと構造が異なり,セグメント単位ではなくページ単位に管理されます。

なお,セグメントには次の表に示す種類があります。

表2-2 セグメントの種類

項番セグメントの種類説明該当するDBエリアの種類
1基本行用セグメント基本行用ページを割り当てるセグメントです。
  • 表用DBエリア
  • ディクショナリ用DBエリア
2インデクス上位ページ用セグメント上位ページを割り当てるセグメントです。
  • インデクス用DBエリア
  • ディクショナリ用DBエリア
3下位ページ用セグメントリーフページ,または行IDリストページを割り当てるセグメントです。
注※
基本行を格納するページを基本行用ページといい,分岐行を格納するページを分岐行用ページといいます。
■基本行とは
通常,1行のデータは同一ページに格納されますが,可変長のデータ型などを使用しているときは,1行のデータサイズが1ページのサイズより大きくなることがあります。この場合,複数のページにデータを分割して格納します。このとき,別ページに格納された行を分岐行といい,その分岐先の情報を格納する行を基本行といいます。
XDBでは,ユーザが作成する表の列のデータ型に,可変長のデータ型をサポートしていないため,ユーザが作成する表では分岐行が発生することはありません。したがって,マニュアル中では,基本行は行と読み替えてください。分岐行についての説明は参考情報としてお読みください。
なお,ディクショナリ表では可変長のデータ型(VARCHAR)をサポートしているため,分岐行が発生することがあります。

参考
セグメントが確保されるタイミング
表用DBエリアのセグメントは,表に行が挿入されたときに確保されます。表の定義時(CREATE TABLE文の実行時)には確保されません。行の追加が繰り返されて,確保済みセグメントに空きページがなくなった場合に,新規セグメントが確保されます。
インデクス用DBエリアのセグメントは,インデクスの定義時(CREATE INDEX文の実行時)に,上位ページ用セグメントと下位ページ用セグメントが一つずつ確保されます。そのあとは,表の場合と同様に,インデクスキーの増加に伴い,必要に応じてセグメントが確保されます。
セグメントが解放されるタイミング
確保されたセグメントは次に示すタイミングで解放されます。
  • eexdbimportコマンドで表データをインポートしたとき(作成モードを指定した場合に限ります)

(2) ページ

ページは,XDBが管理する領域の最小単位です。ページには次に示す三つの種類があります。

(a) データページ

表データを格納するページです。

(b) インデクスページ

インデクスのキー値を格納するページです。インデクスページは上位ページ,下位ページ,行IDリストページに分類されます。

XDBのインデクスはB-tree構造になっています。B-tree構造中の最上位のインデクスページをルートページ,中間のインデクスページを中間ページ,最下位のインデクスページをリーフページといいます。上位ページとはルートページと中間ページのことで,下位ページとはリーフページのことです。

ルートページと中間ページには下段のページの情報が格納されています。また,リーフページには各インデクスのキー値とそのキー値に対応する行の格納位置が格納されています。

行IDリストページは,リーフページ中の特定のキー値が256以上重複した場合,そのキー値専用のページとして作成されます。用途はリーフページと同様で,キー値に対応する表中の行の格納位置を管理します。

(c) ディレクトリページ

DBエリアに関する管理情報を格納するページです。

参考
ページが確保されるタイミング
表用DBエリアのページは,表に行が挿入されたときに確保されます。表の定義時(CREATE TABLE文の実行時)には確保されません。行の追加が繰り返されて,確保済みページが満杯になった場合に,新規ページが確保されます。
インデクス用DBエリアのページは,インデクスの定義時(CREATE INDEX文の実行時)に,ルートページとリーフページが一つずつ確保されます。そのあとは,インデクスページスプリットが発生するたびに新規ページが確保されます。
インデクスページスプリットについては,「3.3.3(1)ページ内の未使用領域とは」を参照してください。
ページが解放されるタイミング
表用DBエリアの場合,確保されたページは次に示すタイミングで解放され,未使用ページとなります。
  • セグメントが解放された場合
    セグメント内の全ページが解放されます。
  • 行の削除によってページ内の全データが削除された場合
    そのページが解放されます。
なお,インデクス用DBエリアのページは,XDBの稼働中に解放されることはありません。