15. clustered のコードを読む7 - PostgreSQL のソースコードを読む

MemoryContext とは?

y-asaba日誌(2006-02-12)さんの解説が良くまとまっている。

heap のコピー

copy_heap_data で heap のコピーが実行される。
入力は

  • from Oid
  • to Oid
  • コピー順序を指定するための Index Oid

の3 つ。

  1. tuple descriptor を見て column 数が同一である事を確認
    • 本当は同一であるチェックが必要だが意図的に省略している
  2. WAL が有効になっている場合は WAL にコピーされるデータを WAL に書く。そのフラグをチェック。
  3. transaction ID (xid) を取得
  4. begin_heap_rewriterewrite 操作を初期化
    • 戻り値は rewrite state 。これはハンドルのようなもので以後の rewrite 操作関数の引数に使われる
  5. index_beginscan(OldHeap, OldIndex, SnapshotAny, 0, (ScanKey) NULL)
    • 戻り値は scan オブジェクト。同じくハンドルとして使う
  6. tuple = index_getnext(scan, ForwardScanDirection) で tuple を1件ずつ順序良く取り出す。
    1. HeapTupleSatisfiesVacuum で dead tuple かどうか調べる
    2. tuple が余計な column を含んでいるかどうかチェックして削る。
    3. rewrite_heap_tuple で heap を実際に new relation に書き込む
    4. old_heap から new_heap へ memcpy
    5. 実際に write