バッファ管理。タプルとかページとか

RelationPutHeapTuple()、ExecutePlan()を読んでの自分なりの理解。

昨日の宿題。タプルについてわかったこと

  • HeapTupleHeaderData
    • タプルのヘッダを表す。このヘッダの後ろにタプル本来のデータが並ぶ。このデータ構造とそのうしろに並ぶデータがページに格納される。こいつ自体はどのリレーションに関連づけられているかは知らない。
  • HeapTupleData
    • メモリ上のタプルを表す。HeapTupleHeaderDataにちょっと肉付けした情報をもつ。どのリレーションに関連付けられているか知っている。
  • TupleTableSlot
    • オプティマイザやエグゼキュータのフェーズでタプルを表す。必要に応じてHeapTupleDataなどに変換されている。Slotという名前から最初はページ上でタプルを管理するdirectory of slotsのことかと思ったけど別物。

TupleTableSlotについては理解があいまい。
IndexTupleDataというものもあり、IndexからHeapTupleHeaderDataを間接的に参照できるようになっているっぽい。

ページについてわかったこと

  • Item
    • ページに管理されるデータ。ページがタプルを管理するものである場合、実体はHeapTupleHeaderDataとその後ろに並ぶデータそのもの。ページの後ろから格納されていく。
  • ItemIdData
    • ページで管理されるdirectory of slot(s)Database Management Systemsでの用語)。ItemへのオフセットやItemの長さを持つ。ページのヘッダの直後に格納されていく。
  • PageHeaderData
    • ページのヘッダ。ページの空き領域(ItemとItemIdDataの間)を管理するインデックスやLSN(Log Sequence Number)に関する情報などをもつ。ページはバッファの構成要素で、PostgreSQLではデフォルト8192バイト。ページはメモリ上の呼び名で、対応するディスク上の領域はブロックと呼ばれるらしい。

LSNについてトランザクション管理の都合で必要とわかっているけど理解できてない。