Pg freespacemap

From PostgreSQL 中文维基, PostgreSQL 中文站, PostgreSQL 中国社区, PostgreSQL Chinese community

Jump to: navigation, search

[编辑] pg_freespacemap

目录

pg_freespacemap 模块提供了检查自由空间表(FSM)的方法。它提供了两个 C 函数:pg_freespacemap_relations 和 pg_freespacemap_pages,它们每个都返回一个记录集,外加两个视图 pg_freespacemap_relations 和 pg_freespacemap_pages 封装了函数以便使用。

缺省的时候,public 对函数和视图的的访问权限是被撤销了的,以免会出现安全问题。

[编辑] 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 里的 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>

Personal tools