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>