pg_freespacemapモジュールは、空き領域マップ(FSM)を検査する手法を提供します。
これは2つのレコード集合を返すC関数、pg_freespacemap_relations
とpg_freespacemap_pages
を提供します。
さらに簡便に使用できるようにこれらの関数を包み隠す2つのビュー、pg_freespacemap_relationsとpg_freespacemap_pagesを提供します。
デフォルトでは、潜在的なセキュリティ問題が存在するため、関数とビューからPUBLICアクセスは取り除かれています。
ビューにより公開される列定義を以下に示します。
表 F-23. pg_freespacemap_relationsの列
名前 | 型 | 参照 | 説明 |
---|---|---|---|
reltablespace | oid | pg_tablespace.oid | リレーションのテーブル空間のOID |
reldatabase | oid | pg_database.oid | リレーションのデータベースOID |
relfilenode | oid | pg_class.relfilenode | リレーションのrelfilenode |
avgrequest | integer | 空き領域要求の移動平均(インデックスの場合はNULL) | |
interestingpages | integer | 最後に有用な空き領域を含むと報告されたページ数 | |
storedpages | integer | 空き領域マップ内に保管された実際のページ数 | |
nextpage | integer | 次に検索を始めるページインデックス(0始まり) |
表 F-24. pg_freespacemap_pagesの列
名前 | 型 | 参照 | 説明 |
---|---|---|---|
reltablespace | oid | pg_tablespace.oid | リレーションのテーブル空間のOID |
reldatabase | oid | pg_database.oid | リレーションのデータベースOID |
relfilenode | oid | pg_class.relfilenode | リレーションのrelfilenode |
relblocknumber | bigint | リレーション内のページ番号 | |
bytes | integer | ページ内の空きバイト数。インデックスページの場合はNULL(後述)。 |
pg_freespacemap_relationsでは、空き領域マップ内のリレーション毎に1行が存在します。 storedpagesはマップ内に格納された実際のページ数であるのに対し、interestingpagesは前回のVACUUMが有用な空き領域の量であるとみなしたページ数です。
storedpagesが一貫してinterestingpagesより小さければ、max_fsm_pagesを増やすことを勧めます。 また、pg_freespacemap_relations内の行数がmax_fsm_relationsに近い場合、max_fsm_relationsを増やすことを検討してください。
pg_freespacemap_pagesでは、空き領域マップ内のページ毎に1行が存在します。 リレーションの行数はpg_freespacemap_relations内のstoredpages列に一致します。
インデックスでは、ページ内の空き領域ではなく、完全に未使用のページが追跡されます。 したがって、ページ内の平均要求容量と空きバイト数は意味がなく、NULLと表示されます。
マップはすべてのデータベースで共有されているため、通常現在のデータベースに属さないリレーションに関する項目が存在します。 これは、一部の行に対してpg_class内に一致する結合行が存在しない可能性がある、または、最悪間違った結合になることを意味します。 pg_classと結合させる場合は、現在のデータベースのOIDまたはゼロと等しいreldatabaseを持つ行だけ結合させることを勧めます。
どちらかのビューにアクセスすると、ビューが表示する状態データをすべてコピーするために必要な期間、内部の空き領域マップはロックされます。 これは、ビューが一貫した結果集合を生成すること、必要以上に長く通常の動作をブロックしないことを保障します。 それにもかかわらず、ビューが頻繁に読み取られる場合はデータベース性能に何らかの影響を与えます。
regression=# SELECT c.relname, r.avgrequest, r.interestingpages, r.storedpages FROM pg_freespacemap_relations r INNER JOIN pg_class c ON r.relfilenode = c.relfilenode AND r.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database())) ORDER BY r.storedpages DESC LIMIT 10; relname | avgrequest | interestingpages | storedpages ---------------------------------+------------+------------------+------------- onek | 256 | 109 | 109 pg_attribute | 167 | 93 | 93 pg_class | 191 | 49 | 49 pg_attribute_relid_attnam_index | | 48 | 48 onek2 | 256 | 37 | 37 pg_depend | 95 | 26 | 26 pg_type | 199 | 16 | 16 pg_rewrite | 1011 | 13 | 13 pg_class_relname_nsp_index | | 10 | 10 pg_proc | 302 | 8 | 8 (10 rows) regression=# SELECT c.relname, p.relblocknumber, p.bytes FROM pg_freespacemap_pages p INNER JOIN pg_class c ON p.relfilenode = c.relfilenode AND p.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database())) ORDER BY c.relname LIMIT 10; relname | relblocknumber | bytes --------------+----------------+------- a_star | 0 | 8040 abstime_tbl | 0 | 7908 aggtest | 0 | 8008 altinhoid | 0 | 8128 altstartwith | 0 | 8128 arrtest | 0 | 7172 b_star | 0 | 7976 box_tbl | 0 | 7912 bt_f8_heap | 54 | 7728 bt_i4_heap | 49 | 8008 (10 rows)
Mark Kirkwood <markir@paradise.net.nz>