pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
pg_freespacemap模块提供了查看空闲空间映射(FSM)内容的方法。它提供了两个 C 函数:pg_freespacemap_relations和pg_freespacemap_pages,各自返回一组记录,另外还提供了包装这两个函数以便于使用的两个视图pg_freespacemap_relations和pg_freespacemap_pages。
出于对潜在安全问题的防范,默认情况下这两个函数和视图的公共访问权限都被撤销。
pg_freespacemap的视图这些视图暴露的列的定义如下:
表 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,空闲空间映射中的每个关系对应一行。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 或零的行上。
访问任何一个视图时,都会在足够长的时间内持有内部的空闲空间映射锁,以复制该视图要显示的全部状态数据。这确保了视图能产生一致的结果集,同时又不会比必要的更久地阻塞正常活动。尽管如此,如果频繁读取它们,仍可能对数据库性能产生一定影响。
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>
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。