10. clustered のコードを読む2 - PostgreSQL のソースコードを読む

昨日の続き。 cluster_rel を見ていく。

コメントから

  • table を clster する
  • 新しい clustered なテーブルを作り、関連する filenode を古いものと交換する
    • このため新しいテーブルの OID は変更されない
    • このおかげで GRANT や継承が壊れない。
    • 効率的な bulk load をするらしい。
  • 同じ方法で新しいインデックスを作る
    • テーブルが出来てから index 構築の方が効率が良い


分からない点としては、関連する filenode を交換するという部分。いわゆる i-node 的な OS の話なのかもっと上のレイヤの話なのか。コードを読むときに意識しよう。
さて実際にコードを追ってみよう。
おおまかな流れは

  1. 再度ロックを確認
  2. 対象が temp テーブルだったら skip
  3. index が既に clustered なら skip
  4. index が cluster 可能かチェック
    • check_index_is_clusterable
    • その table の index か?
    • system catalogue は cluster できない
    • などなど深い生石内
  5. rebuild_relation が後の処理を引き受ける

rebuild_relation

table を index の順序で rebuild する。
入力は

  • テーブル
  • 順序の基準となる index

の 2 つ。


処理の流れ

  1. index に clstered マークをつける
  2. 元のテーブルと同じ namespace で temp heap を割り当てる(heap って何だ?)
  3. heap データを新しいテーブルに望む順序で copy する(heap って何だ?)
  4. 物理ファイルを new/old で交換する
  5. old テーブルとひもづいた heap を破棄する
  6. インデックス再構築。

問題が見えてきた。

  • heap とは何か?
  • heap の copy は何をしているのか?

の2点。

heap とは何か?

まずはマニュアルを見る。知っている概念の別名かもしれないし。
どうやらヒープとはテーブルのデータを指すらしい。やっぱりソース追わないとだめかな。
明日落ち着いて考えよう。

todo

  • filenode って何?
  • heap って何?

続きは明日。