↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3
历史版本。 PostgreSQL 8.3 已结束支持。 请参阅 当前版本手册.

F.21. pg_freespacemap #

pg_freespacemap模块提供了查看空闲空间映射(FSM)内容的方法。它提供了两个 C 函数:pg_freespacemap_relations和pg_freespacemap_pages,各自返回一组记录,另外还提供了包装这两个函数以便于使用的两个视图pg_freespacemap_relations和pg_freespacemap_pages。

出于对潜在安全问题的防范,默认情况下这两个函数和视图的公共访问权限都被撤销。

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,空闲空间映射中的每个关系对应一行。storedpages是实际存储在映射中的页数,而interestingpages是最近一次VACUUM认为含有足量空闲空间的页数。

如果storedpages持续小于interestingpages,那么增大max_fsm_pages会是一个好主意。同样,如果pg_freespacemap_relations中的行数接近max_fsm_relations,就应当考虑增大max_fsm_relations。

对于pg_freespacemap_pages,空闲空间映射中的每一页对应一行。某个关系的行数将与pg_freespacemap_relations中该关系的storedpages列一致。

对于索引,被跟踪的是完全未使用的页,而不是页内空闲空间。因此,平均请求大小和页内空闲字节数没有意义,显示为 NULL。

由于该映射为所有数据库共享,通常会有不属于当前数据库的关系的条目。这意味着某些行在pg_class中可能没有可匹配的连接行,甚至可能产生错误的连接。如果你打算与pg_class做连接,最好把连接限制在reldatabase等于当前数据库 OID 或零的行上。

访问任何一个视图时,都会在足够长的时间内持有内部的空闲空间映射锁,以复制该视图要显示的全部状态数据。这确保了视图能产生一致的结果集,同时又不会比必要的更久地阻塞正常活动。尽管如此,如果频繁读取它们,仍可能对数据库性能产生一定影响。

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

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.