10. clustered のコードを読む2 - PostgreSQL のソースコードを読む
昨日の続き。 cluster_rel を見ていく。
コメントから
- table を clster する
- 新しい clustered なテーブルを作り、関連する filenode を古いものと交換する
- このため新しいテーブルの OID は変更されない
- このおかげで GRANT や継承が壊れない。
- 効率的な bulk load をするらしい。
- 同じ方法で新しいインデックスを作る
- テーブルが出来てから index 構築の方が効率が良い
分からない点としては、関連する filenode を交換するという部分。いわゆる i-node 的な OS の話なのかもっと上のレイヤの話なのか。コードを読むときに意識しよう。
さて実際にコードを追ってみよう。
おおまかな流れは
- 再度ロックを確認
- 対象が temp テーブルだったら skip
- index が既に clustered なら skip
- index が cluster 可能かチェック
- check_index_is_clusterable
- その table の index か?
- system catalogue は cluster できない
- などなど深い生石内
- rebuild_relation が後の処理を引き受ける
rebuild_relation
table を index の順序で rebuild する。
入力は
- テーブル
- 順序の基準となる index
の 2 つ。
処理の流れ
- index に clstered マークをつける
- 元のテーブルと同じ namespace で temp heap を割り当てる(heap って何だ?)
- heap データを新しいテーブルに望む順序で copy する(heap って何だ?)
- 物理ファイルを new/old で交換する
- old テーブルとひもづいた heap を破棄する
- インデックス再構築。
問題が見えてきた。
- heap とは何か?
- heap の copy は何をしているのか?
の2点。
heap とは何か?
まずはマニュアルを見る。知っている概念の別名かもしれないし。
どうやらヒープとはテーブルのデータを指すらしい。やっぱりソース追わないとだめかな。
明日落ち着いて考えよう。
todo
- filenode って何?
- heap って何?
続きは明日。