12. clustered のコードを読む4 - PostgreSQL のソースコードを読む

RelFileNode を見る

RelFileNode は Relation に物理的にアクセスするために必要な情報を提供する。
RelFileNode は 3 つの Oid を保持

  • spcNode :テーブルスペース
  • dbNode : データベース
  • relNode : リレーション
    • pg_class.relfilenode に相当

SMgrRelation を見る

実体は SMgrRelationData 構造体。
保持しているのは

  • RelFileNode smgr_rnode; : 上記の RelFileNode
  • struct SMgrRelationData **smgr_owner; :オーナー
  • int smgr_which
    • どの storage を使うか。smgrsw 配列の index 。
    • md.c しかないので 0 しかない。
  • struct _MdfdVec *md_fd;
    • md 依存のデータがここにあるのはどうよ。せめて void* とかに。

heap desc

heap desc というのは TupleDesc のことだった。TupleDesc とはテーブルのカラムの定義のかたまり。
予想通りの構造。

typedef struct tupleDesc
{
int			natts;			/* number of attributes in the tuple */
Form_pg_attribute *attrs;
/* attrs[N] is a pointer to the description of Attribute Number N+1 */
TupleConstr *constr;		/* constraints, or NULL if none */
Oid			tdtypeid;		/* composite type ID for tuple type */
int32		tdtypmod;		/* typmod for tuple type */
bool		tdhasoid;		/* tuple has oid attribute in its header */
int			tdrefcount;		/* reference count, or -1 if not counting */
}	*TupleDesc;

rel cache

heap 作成時に、RelationBuildLocalRelation の戻り値として返ってくる rel cache とは何か?
型は Relation 。なぜ cache と呼ばれているかはおいておいて、Relation の構造を見ていく。


Relation はテーブルのメタデータ。構造体メンバが多すぎるので目につくものをピックアップ。

  • current insertion block
  • リファレンスカウント
  • 各種フラグ
  • class
  • tuple descriptior
  • oid
  • index の oid list
  • lock のための構造
  • MemoryContext (これ何?)
  • Trigger Desc

などなど。

cluster 作成時の filenode の交換とは?

swap_relation_files で何が起こるか。

  • 2つの Relation の Oid から、それぞれの Form_pg_class を取り出す
  • Form_pg_class にある以下のメンバを swap する
    • relfilenode
    • reltablespace
    • reltoastrelid

なぜこれらを swap するとテーブルが入れ替わった事になるのか分からないのでそれぞれ見ていく。

relfilenode

Form_pg_class.relfilenode をみると

Oid relfilenode; /* identifier of physical storage file */

今日は時間切れ。続きは明日以降。

todo

  • MemoryContext
  • cluster にもどり heap の copy など