PostgreSQL Index Only Scan 奮闘記 その2

どうも。村上です。

前回に引き続きPostgreSQLです。

今はこんな感じです。

追記型アーキテクチャ
バキューム     ← 前回ここまで
Visibility Map  ← 今回ここ
プラン演算子
Index Only Scan

とうことで今日はVisibility Mapです。

バキュームって遅くないの?

バキュームの処理ってテーブルを参照して、不要領域を探して、空き領域にします。
つまり対象テーブル全体をスキャンするので、遅くなるようなイメージです。

postgresql-techscore-blog2-1

でも、PostgreSQL8.4からその辺が改善されています。
その機能がVisibility Mapです。

Visibility Map

Visibility Map(VM:可視性マップ)はバージョン8.4から追加されたものです。

・Visibility Mapとは。。。
すべてのトランザクションから可視かどうかを1ページ1ビットで持つ

・Visibility Mapは実態は何か?
「ファイルノード_vm」というファイル名で保存されている

・ビットの意味は
ビットが立っている・・・ページ内の行がすべてのトランザクションで可視の状態
ビットがたっていない・・・あるトランザクションで可視でない可能性がある

・バキューム
バキューム時はVisibility Mapを参照して効率よくバキューム

箇条書きにしてもわからないと思うので、図にしてみると

postgresql-techscore-blog2-2

こんな感じです。

簡単に言うと不要領域(ガベージ)を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

ということで、次回はプラン演算子についてです。

Comments are closed, but you can leave a trackback: Trackback URL.