pg_buffercache
pg_buffercache模块提供了一种方法实时检查共享缓冲区。
该模块提供了一个 C 函数pg_buffercache_pages,它返回一个记录的集合,外加一个包装了该函数以便于使用的视图pg_buffercache。
默认情况下,使用仅限于超级用户和pg_monitor 角色的成员。可以使用GRANT给其他人授予访问权限。
1. pg_buffercache视图
视图显示的列的定义如表 C.15所示。
表 C.15. pg_buffercache 列
| 列类型/描述 |
|---|
| bufferid integer ID,在范围 1..shared_buffers中 |
| relfilenode oid (references pg_class.relfilenode) 关系的文件结点编号 |
| reltablespace oid (references pg_tablespace.oid) 关系的表空间 OID |
| reldatabase oid (references pg_database.oid) 关系的数据库 OID |
| relforknumber smallint关系内的分叉数 |
| relblocknumber bigint 关系内的页面数 |
| isdirty boolean 页面是否为正确 |
| usagecount smallint Clock-sweep 访问计数 |
| pinning_backends integer 对这个缓冲区加 pin 的后端数量 |
共享缓存中的每一个缓冲区都有一行。没有使用的缓冲区的行中只有bufferid为非空。共享的系统目录被显示数据库为零。
因为缓冲是所有数据库共享的,通常会有不属于当前数据库的关系的页面。这意味着对于一些行在pg_class中可能不会有匹配的连接行,或者甚至有错误的连接。如果你试图与pg_class连接,将连接限制于reldatabase等于当前数据库 OID 或零的行是一个好主意。
由于缓冲区管理器锁不会用于复制视图将显示的缓冲区状态数据,因此访问pg_buffercache视图对正常缓冲区活动的影响较小,但它不会在所有缓冲区中提供一致的结果集。但是,我们确保每个缓冲区的信息是准确的。
2. 样例输出
test=## SELECT n.nspname, c.relname, count(*) AS buffers
test-## FROM pg_buffercache b JOIN pg_class c
test-## ON b.relfilenode = pg_relation_filenode(c.oid) AND
test-## b.reldatabase IN (0, (SELECT oid FROM pg_database
test(## WHERE datname = current_database()))
test-## JOIN pg_namespace n ON n.oid = c.relnamespace
test-## GROUP BY n.nspname, c.relname
test-## ORDER BY 3 DESC
test-## LIMIT 10;
nspname | relname | buffers
------------+--------------------------------+---------
test | bloomidx | 11778
test | tbloom | 530
pg_catalog | pg_proc | 198
pg_catalog | pg_depend | 136
pg_catalog | pg_depend_reference_index | 88
pg_catalog | pg_attribute | 75
pg_toast | pg_toast_2618 | 73
pg_catalog | pg_depend_depender_index | 71
pg_catalog | pg_proc_proname_args_nsp_index | 51
pg_catalog | pg_collation | 49
(10 rows)