どうも。村上です。
前回に引き続きPostgreSQLです。
今はこんな感じです。
追記型アーキテクチャ
バキューム ← 前回ここまで
Visibility Map ← 今回ここ
プラン演算子
Index Only Scan
とうことで今日はVisibility Mapです。
バキュームって遅くないの?
バキュームの処理ってテーブルを参照して、不要領域を探して、空き領域にします。
つまり対象テーブル全体をスキャンするので、遅くなるようなイメージです。
でも、PostgreSQL8.4からその辺が改善されています。
その機能がVisibility Mapです。
Visibility Map
Visibility Map(VM:可視性マップ)はバージョン8.4から追加されたものです。
・Visibility Mapとは。。。
すべてのトランザクションから可視かどうかを1ページ1ビットで持つ
・Visibility Mapは実態は何か?
「ファイルノード_vm」というファイル名で保存されている
・ビットの意味は
ビットが立っている・・・ページ内の行がすべてのトランザクションで可視の状態
ビットがたっていない・・・あるトランザクションで可視でない可能性がある
・バキューム
バキューム時はVisibility Mapを参照して効率よくバキューム
箇条書きにしてもわからないと思うので、図にしてみると
こんな感じです。
簡単に言うと不要領域(ガベージ)をVisibility Mapによって管理できるようになったので、Visibility Mapを参照して、不要領域の回収を効率良くするということです。
Free Scan Map
Visibility Mapのファイル(ファイルノード_vm)を実際に見た方は「ファイルノード_fsm」というファイルも見たんではないでしょうか?
こいつなんやねん?
って思うかもしれませんが、これは「Free Scan Map」というものです。
これは空き領域がどこにあるかを管理している機構です。
バキュームによって空き領域は、次の更新(InsertやUpdate)で再利用され、空き領域にデータが挿入されます。
この時に空き領域がどこにあるかわからなければ、またテーブルをスキャンして、空き領域を見つけてデータを挿入することになります。
これを効率化するために、空き領域を管理するFree Scan Mapがあります。
Visibility Mapは不要領域を管理するもので、Free Scan Mapは空き領域を管理するものです。
まとめ
ということで今回はVisibility Mapでした。
Visibility Mapはバキューム時に使用されている機構ですが、Index Only Scan時にも使用されています。
詳しくはIndex Only Scanの時に説明します。
追記型アーキテクチャ
バキューム
Visibility Map ← イマココ
プラン演算子
Index Only Scan
ということで、次回はプラン演算子についてです。