F.21. pg_freespacemap

pg_freespacemapモジュールは、空き領域マップ(FSM)を検査する手法を提供します。 これは2つのレコード集合を返すC関数、pg_freespacemap_relationspg_freespacemap_pagesを提供します。 さらに簡便に使用できるようにこれらの関数を包み隠す2つのビュー、pg_freespacemap_relationspg_freespacemap_pagesを提供します。

デフォルトでは、潜在的なセキュリティ問題が存在するため、関数とビューからPUBLICアクセスは取り除かれています。

F.21.1. pg_freespacemapのビュー

ビューにより公開される列定義を以下に示します。

表 F-23. pg_freespacemap_relationsの列

名前参照説明
reltablespaceoidpg_tablespace.oidリレーションのテーブル空間のOID
reldatabaseoidpg_database.oidリレーションのデータベースOID
relfilenodeoidpg_class.relfilenodeリレーションのrelfilenode
avgrequestinteger 空き領域要求の移動平均(インデックスの場合はNULL)
interestingpagesinteger 最後に有用な空き領域を含むと報告されたページ数
storedpagesinteger 空き領域マップ内に保管された実際のページ数
nextpageinteger 次に検索を始めるページインデックス(0始まり)

表 F-24. pg_freespacemap_pagesの列

名前参照説明
reltablespaceoidpg_tablespace.oidリレーションのテーブル空間のOID
reldatabaseoidpg_database.oidリレーションのデータベースOID
relfilenodeoidpg_class.relfilenodeリレーションのrelfilenode
relblocknumberbigint リレーション内のページ番号
bytesinteger ページ内の空きバイト数。インデックスページの場合は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を持つ行だけ結合させることを勧めます。

どちらかのビューにアクセスすると、ビューが表示する状態データをすべてコピーするために必要な期間、内部の空き領域マップはロックされます。 これは、ビューが一貫した結果集合を生成すること、必要以上に長く通常の動作をブロックしないことを保障します。 それにもかかわらず、ビューが頻繁に読み取られる場合はデータベース性能に何らかの影響を与えます。

F.21.2. サンプル出力

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)
  

F.21.3. 作者

Mark Kirkwood

アダルトレンタルサーバー