🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# F.24\. pg_buffercache `pg_buffercache`模块提供实时检查共享缓存内发生了什么的用途。 该模块提供一个C函数`pg_buffercache_pages`,该函数返回一个记录集, 加上一个包裹该函数为了方便使用的视图`pg_buffercache`。 缺省情况下取消这两种的公共访问,以防隐藏的安全问题。 ## F.24.1\. `pg_buffercache` 视图 被视图暴露的字段的定义显示在[Table F-14](#calibre_link-2300)里。 **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 `<[markir@paradise.net.nz](mailto:markir@paradise.net.nz)>` 设计建议:Neil Conway `<[neilc@samurai.com](mailto:neilc@samurai.com)>` 调试建议:Tom Lane `<[tgl@sss.pgh.pa.us](mailto:tgl@sss.pgh.pa.us)>`