バッファ管理。バッファ、ブロック、ページ、アイテムの区別。

これまで区別があいまいだったデータ構造を整理してみた。

バッファ関連
  • BufferDesc
    • バッファ記述子。共有バッファを構成する1フレーム。制御情報を持つ。Page(Block)を管理する。
  • Buffer
    • BufferDescの識別子相当。1はじまり。BufferDescの配列のindexに使われる(indexにはいつも1が引かれて使用される)。
ブロック関連
  • BlockNumber
    • あるファイルの特定のBlockを示す。最初のBlockは0。ファイルごとに0から始まるのではなくリレーションごとに0からはじまるのよう(容量が大きくなれば(1GB)リレーションは複数のファイルに分割される)。
  • BlockId
    • 意味はBlockNumberとほぼ同じ。
  • Block
    • ディスクから読まれたデータ。BlockNumberに対応する。
ページ関連
  • PageHeader
    • Page(Block)と同じアドレスから始まる。Page(Block)のヘッダ。制御情報を持つ。
  • Page
    • Blockと同じアドレスから始まる領域。PageHeader、ItemId、空き領域、Itemから成る。
アイテム関連
  • ItemId
    • Itemへのポインタ。Itemの状態や長さをもつ。
  • Item
    • データそのもの。通常タプルのこと。

Itemにアクセスするまでの典型的なケース

処理の流れをイメージすると区別がつきやすい

  1. どのBufferDescを使うか決める(共有バッファのどこに読み込むか決めるということ)。
  2. リレーション情報(ファイル名とか)とBlockNumberを使ってディスク上のデータをBufferDescに対応するメモリに読み込む。
  3. BufferDescからBufferを求める。
  4. メモリ上のデータをBufferにより特定しPageやPageHeaderとして取得する。
  5. Pageに含まれるItemIdをPageHeader上の情報を使って取得する
  6. ItemIdからItemを取得する。

わかりにくい原因は次の2つだと思う

  • BlockとPageが同じものを指してる。
  • Bufferという名前が何かを指し示す意味になっていない。まるでデータを表しているかのよう。(BufferIdとかBufferNumberだともう少しわかりやすいと思う)。