バッファ管理。タプルの追加。宿題への回答
きのうの宿題の回答
- タプル追加のためにバッファを取得するロジックはどうなっている?
- いろんな条件があるけど、よくありそうなケースは開き領域があれば今のページ、なければ新しいページを取得。テーブルに空きを残すためのFILLFACTORが考慮されている。FILLFACTORはデフォルトだと100。更新されるテーブルには100以外を指定するように調整すべき。確かHOT(Hot Only Tuple)も同じページにある場合にのみ有効だったはず。FILLFACTORはCREATE TABLEで指定できる。
- ラージオブジェクトを管理するしくみ(TOAST)についても考慮されているけど、今はスルー。どう管理しているかはいずれ理解したい。
- ログの情報はどのようなもの?
- タプルのデータ、登録先のブロック、ブロック内のオフセット、タプルの状態を表すフラグなどなど。heap_xlog_insert()などリカバリの処理でログからデータを取り出しているところを見ると何を入れていたのかがわかりやすい。ただ、ログを追加する処理のXLogInsert()が難しすぎて細かいところまで理解できていない。
- LSNとは何か?その役割は?
- LSN(Log Sequence Number)は構造体としてはXLogRecPtr。WALログのファイルとファイル内のoffsetを表す。WALログのレコードにつき一意。タプルの更新ごとにそのタプルに対応するLSNが(タプルを含む)ページのヘッダに記録される。少なくとも、リカバリ時にログのレコードがすでにページに適用されているかどうかを判断するために使われている。チェックポイントのときにも参照されると聞いたけど未確認。MVCCと関係あると思っていたけど関係ないかも。
- タイムラインIDとは何か?
- PITR(Point In Time Recovery)で特定の時系列を指し示すID。PostgreSQL 8 Point In Time Recovery (PITR) 利用ガイドが図付きの説明があってわかりやすい。IBMでPostgreSQLの資料が公開されてるもんなんですね。
- キャッシュを無効にすると際のロジックはどうなっている?
- キャッシュのロジックはシステムカタログ用のものだった。システムカタログのデータは各バックエンドプロセスで個別にキャッシュしているって何かで読んだことがある。今はスルー。
反省と課題
- ページとバッファの用語が使い分けられていない。あと、それぞれヘッダの構造体とデータそのものを区別して言葉にできていない。
- ちょっと興味の対象がぶれているような気がするけど今は気になるところを気の向くままに調べてみるフェーズ(ということにしている)。
- 明日以降は、チェックポイント、CLOG、タプルの更新や削除あたりを追ってみるつもり。