Pg buffercache
From PostgreSQL 中文维基, PostgreSQL 中文站, PostgreSQL 中国社区, PostgreSQL Chinese community
[编辑] pg_buffercache
pg_buffercache 提供了实时检查共享缓冲区中发生的事情的手段。
这个模块提供了一个 C 函数 pg_buffercache_pages,它返回一个记录的集合,还提供了一个视图 pg_buffercache,封装了函数以便于使用。
缺省的时候,两个对象都禁止公开的访问,主要是防止有安全的问题存在。
[编辑] pg_buffercache 视图
视图暴露出来的字段的定义如下:
| 名字 | 类型 | 引用 | 描述 |
| bufferid | integer | ID,范围是 1..shared_buffers | |
| relfilenode | oid | pg_class.relfilenode | 关系的 Relfilenode |
| reltablespace | oid | pg_tablespace.oid | 关系的表空间 OID |
| reldatabase | oid | pg_database.oid | 关系的数据库 OID |
| relblocknumber | bigint | 在关系内的页面编号 | |
| isdirty | boolean | 页面是否为脏的? | |
| usagecount | smallint | 页面的 LRU 计数 |
在共享缓冲区里面每个缓冲区一行。未用的缓冲区显示的时候所有字段都是空的,除 bufferid 之外。共享的系统表显示为属于数据库零。
因为缓冲区是在所有数据库只见共享的,所以通常会有来自某关系的页面并不属于当前的数据库。这就意味着可能有一些行在 pg_class 里找不到连接行,或者甚至可能有不正确的连接。如果你试图于 pg_class 连接,那么通常来说,把连接限制于那些 reldatabase 等于当前数据库的 OID 或者为 0 的行会是一个好主意。
在访问 pg_buffercache 视图的时候,会施加内部的缓冲区管理器的锁以拷贝视图显示所需要的所有缓冲区状态。这样就保证了视图能生成一致的结果集,同时也不会对正常的缓冲区活动产生不必要的锁。当然,如果这个视图阅读得太频繁,肯定会对数据库性能产生一些影响。
[编辑] 样例输出
regression=# SELECT c.relname, count(*) AS buffers
FROM pg_buffercache b INNER JOIN pg_class c
ON b.relfilenode = c.relfilenode 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)
[编辑] 作者
Mark Kirkwood <markir@paradise.net.nz> 设计建议: Neil Conway <neilc@samurai.com> 调试建议: Tom Lane <tgl@sss.pgh.pa.us>
