Pg freespacemap
From PostgreSQL 中文维基, PostgreSQL 中文站, PostgreSQL 中国社区, PostgreSQL Chinese community
[编辑] pg_freespacemap
pg_freespacemap 模块提供了检查自由空间表(FSM)的方法。它提供了两个 C 函数:pg_freespacemap_relations 和 pg_freespacemap_pages,它们每个都返回一个记录集,外加两个视图 pg_freespacemap_relations 和 pg_freespacemap_pages 封装了函数以便使用。
缺省的时候,public 对函数和视图的的访问权限是被撤销了的,以免会出现安全问题。
[编辑] pg_freespacemap 视图
视图输出的字段的定义是:
| 名称 | 类型 | 引用 | 描述 |
| 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 开始计) |
| 名称 | 类型 | 引用 | 描述 |
| 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 里的 storepages 字段匹配。
对于索引,跟踪的是完全未用的页面,而不是页面内的自由空间。因此,在页面内的平均请求大小和自由的字节都是无意义的,所以都显示为 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>
