F.24. pg_buffercache
pg_buffercache
模块提供实时检查共享缓存内发生了什么的用途。
该模块提供一个C函数pg_buffercache_pages
,该函数返回一个记录集, 加上一个包裹该函数为了方便使用的视图pg_buffercache
。
缺省情况下取消这两种的公共访问,以防隐藏的安全问题。
F.24.1. pg_buffercache
视图
被视图暴露的字段的定义显示在Table F-14里。
Table F-14. pg_buffercache
字段
名字 | 类型 | 引用 | 描述 |
---|---|---|---|
bufferid |
integer |
ID, 范围为 1..shared_buffers |
|
relfilenode |
oid |
pg_class.relfilenode |
关系的文件节点号 |
reltablespace |
oid |
pg_tablespace.oid |
关系的表空间OID |
reldatabase |
oid |
pg_database.oid |
关系的数据库OID |
relblocknumber |
bigint |
关系的页码 | |
relforknumber |
smallint |
关系的分支编号; 参阅 include/storage/relfilenode.h |
|
isdirty |
boolean |
页脏了吗? | |
usagecount |
smallint |
时钟下摆访问计数 |
在共享缓存中每个缓冲区都有一行记录。未使用的缓冲区显示为所有字段为空,除了bufferid
。 共享的系统目录显示为属于数据库零。
因为缓存被所有数据库共享,通常有几页的关系不属于当前数据库。 这意味着某些行在pg_class
中没有匹配的连接行, 或者甚至有不正确的连接。如果你尝试连接pg_class
, 限制连接到的行的reldatabase
等于当前数据库的OID或0是个好主意。
当访问pg_buffercache
视图时,认为内部缓冲区锁管理器足够长, 能够拷贝视图将显示的所有的缓冲区状态数据。这保证了视图产生一个一致的结果集, 当不再需要阻塞正常的缓冲区活动时。但是,如果频繁的阅读这个视图, 可能会对数据库性能造成一些影响。
F.24.2. 示例输出
regression=# SELECT c.relname, count(*) AS buffers
FROM pg_buffercache b INNER JOIN pg_class c
ON b.relfilenode = pg_relation_filenode(c.oid) AND
b.reldatabase IN (0, (SELECT oid FROM pg_database
WHERE datname = current_database()))
GROUP BY c.relname
ORDER BY 2 DESC
LIMIT 10;
relname | buffers
---------------------------------+---------
tenk2 | 345
tenk1 | 141
pg_proc | 46
pg_class | 45
pg_attribute | 43
pg_class_relname_nsp_index | 30
pg_proc_proname_args_nsp_index | 28
pg_attribute_relid_attnam_index | 26
pg_depend | 22
pg_depend_reference_index | 20
(10 rows)
F.24.3. 作者
Mark Kirkwood <[[email protected]](mailto:[email protected])>
设计建议:Neil Conway <[[email protected]](mailto:[email protected])>
调试建议:Tom Lane <[[email protected]](mailto:[email protected])>