バッファ管理。バッファ、ブロック、ページ、アイテムの区別。
これまで区別があいまいだったデータ構造を整理してみた。
バッファ関連
- 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にアクセスするまでの典型的なケース
処理の流れをイメージすると区別がつきやすい
- どのBufferDescを使うか決める(共有バッファのどこに読み込むか決めるということ)。
- リレーション情報(ファイル名とか)とBlockNumberを使ってディスク上のデータをBufferDescに対応するメモリに読み込む。
- BufferDescからBufferを求める。
- メモリ上のデータをBufferにより特定しPageやPageHeaderとして取得する。
- Pageに含まれるItemIdをPageHeader上の情報を使って取得する
- ItemIdからItemを取得する。
わかりにくい原因は次の2つだと思う
- BlockとPageが同じものを指してる。
- Bufferという名前が何かを指し示す意味になっていない。まるでデータを表しているかのよう。(BufferIdとかBufferNumberだともう少しわかりやすいと思う)。