ヒープとハッシュインデックス以外のインデックスリレーションはそれぞれ、そのリレーション内で利用可能な領域を継続して追跡するために、空き領域マップ(FSM)を持ちます。
これは、個々のリレーションのフォーク内の主リレーションデータに沿って、リレーションのファイルノード番号に_fsm
という接尾辞を付けた名前のファイルに格納されます。
例えばリレーションのファイルノードが12345であれば、FSMは主リレーションファイルと同じディレクトリ内の12345_fsm
という名前のファイルに格納されます。
空き領域マップはFSMページのツリーとして編成されます。 最下位レベルのFSMページはすべてのヒープ(またはインデックス)ページで利用可能な空き領域を、各ページ毎に1バイト使用して格納します。 上位レベルは下位レベルからの情報を集約します。
各FSMページの内部はノード当たり1バイトを持つ配列内に格納されたバイナリツリーです。 各リーフノードはヒープページ、または下位レベルのFSMページを表現します。 各非リーフノード内には、子の値より大きな値が格納されます。 したがってリーフノード内の最大値がルートに格納されます。
FSMがどのように構築されるか、そしてどのように更新、検索されるかに関する詳細はsrc/backend/storage/freespace/README
を参照してください。
pg_freespacemapモジュールを使用して、空き領域マップに格納された情報を調べることができます。