pg_visibility
モジュールは可視性マップ(Visibility Map, VM)およびテーブルのページレベルでの可視性情報を検査する手段を提供します。
このモジュールはまた、可視性マップの整合性を検査し、強制的に再構築する機能も提供します。
ページレベルの可視性についての情報を格納するために、3つの異なるビットが使用されます。
可視性マップの全可視ビットは、対応するリレーションのページの全タプルがすべての現在および将来のトランザクションに対して可視であることを示します。
可視性マップの全凍結ビットは、そのページのすべてのタプルが凍結されていることを示します。
これはすなわち、そのページに対してタプルの挿入、更新、削除、ロックなどが発生しない限り、将来もバキュームによる修正が必要ないことを意味します。
ページヘッダのPD_ALL_VISIBLE
ビットは、可視性マップの全可視ビットと同じ意味ですが、別のデータ構造ではなく、データページ自体の中に格納されています。
これら2つのビットは通常は同じ値になりますが、クラッシュリカバリの後は、ページの全可視ビットがセットされているのに、可視性マップの全可視ビットはクリアされているということもあります。
また、pg_visibility
が可視性マップを検査した後、データページを検査する前に更新が行われたために、これらについて報告される値が一致しないということもあり得ます。
データ破壊を起こすような何らかのイベントの後も、これらのビットが異なることがあり得ます。
PD_ALL_VISIBLE
ビットに関する情報を表示する関数は、可視性マップのみを参照する関数に比べるとずっと高価です。
これは、可視性マップだけではなく、(それよりずっと大きな)リレーションのデータブロックを読む必要があるからです。
リレーションのデータブロックを検査する関数は、同様に高価です。
pg_visibility_map(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean) returns record
指定のリレーションの指定のブロックについて、可視性マップ内の全可視ビットと全凍結ビットを返します。
pg_visibility(relation regclass, blkno bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns record
指定のリレーションの指定のブロックについて、可視性マップ内の全可視ビットと全凍結ビット、およびそのブロックのPD_ALL_VISIBLE
を返します。
pg_visibility_map(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean) returns setof record
指定のリレーションの各ブロックについて、全可視ビットと全凍結ビットを返します。
pg_visibility(relation regclass, blkno OUT bigint, all_visible OUT boolean, all_frozen OUT boolean, pd_all_visible OUT boolean) returns setof record
指定のリレーションの各ブロックについて、全可視ビットと全凍結ビット、および各ブロックのPD_ALL_VISIBLE
ビットを返します。
pg_visibility_map_summary(relation regclass, all_visible OUT bigint, all_frozen OUT bigint) returns record
可視性マップに従って、リレーション内の全可視ページの数と全凍結ページの数を返します。
pg_check_frozen(relation regclass, t_ctid OUT tid) returns setof tid
可視性マップ内で全凍結と印を付けられたページ内に格納されている非凍結タプルのTIDを返します。 この関数が返すTIDの集合が空でないなら、可視性マップは壊れています。
pg_check_visible(relation regclass, t_ctid OUT tid) returns setof tid
可視性マップ内で全可視と印を付けられたページ内に格納されている全可視でないタプルのTIDを返します。 この関数が返すTIDの集合が空でないなら、可視性マップは壊れています。
pg_truncate_visibility_map(relation regclass) returns void
指定のリレーションの可視性マップを切り詰めます。
そのリレーションの可視性マップが壊れていると思われ、強制的に再構築したい場合にこの関数は有効です。
この関数を実行した後に、指定のリレーション上で実行される最初のVACUUM
において、リレーション内の全ページがスキャンされ、可視性マップが再構築されます。
(それが終わるまでは、可視性マップの中がすべてゼロになっているものとして問い合わせは動作します。)
デフォルトでは、これらの関数はスーパーユーザとpg_stat_scan_tables
ロールの権限を持つロールのみが実行可能です。pg_truncate_visibility_map(relation regclass)
は例外で、スーパーユーザのみが実行可能です。
Robert Haas <rhaas@postgresql.org>