15. clustered のコードを読む7 - PostgreSQL のソースコードを読む
MemoryContext とは?
y-asaba日誌(2006-02-12)さんの解説が良くまとまっている。
heap のコピー
copy_heap_data で heap のコピーが実行される。
入力は
- from Oid
- to Oid
- コピー順序を指定するための Index Oid
の3 つ。
- tuple descriptor を見て column 数が同一である事を確認
- 本当は同一であるチェックが必要だが意図的に省略している
- WAL が有効になっている場合は WAL にコピーされるデータを WAL に書く。そのフラグをチェック。
- transaction ID (xid) を取得
- begin_heap_rewrite で rewrite 操作を初期化
- index_beginscan(OldHeap, OldIndex, SnapshotAny, 0, (ScanKey) NULL)
- 戻り値は scan オブジェクト。同じくハンドルとして使う
- tuple = index_getnext(scan, ForwardScanDirection) で tuple を1件ずつ順序良く取り出す。
- HeapTupleSatisfiesVacuum で dead tuple かどうか調べる
- tuple が余計な column を含んでいるかどうかチェックして削る。
- rewrite_heap_tuple で heap を実際に new relation に書き込む
- old_heap から new_heap へ memcpy
- 実際に write