E.9. lt_buffercache

E.9.1. pg_buffercache 视图
E.9.2. 示例输出

lt_buffercache 模块提供了实时查看共享缓存区中发生的情况的方法。

该模块提供了一个 C 函数 pg_buffercache_pages,它返回一组记录,以及一个视图 pg_buffercache ,该视图将函数包装为方便使用。

默认情况下,仅超级用户和 pg_monitor 角色的成员可以使用。可以使用 GRANT 授予其他用户访问权限。

E.9.1.  pg_buffercache 视图

该视图公开的列的定义在 Table E.2 中显示。

Table E.2.  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

relforknumber smallint

关系内部的 Fork 编号;请参见 include/common/relpath.h

relblocknumber bigint

关系中的页面编号

isdirty boolean

页面是否是脏页?

usagecount smallint

时钟算法扫描访问计数

pinning_backends integer

固定此缓存区的后端数量


共享缓存中每个缓存区都有一行记录。未使用的缓存区所有字段均为空,仅 bufferid 不为空。共享系统目录显示为属于数据库零。

由于缓存是由所有数据库共享的,因此通常会有来自不属于当前数据库的表的页面。这意味着有些行可能在 pg_class 中没有匹配的连接行,或者甚至可能存在错误的连接。如果您尝试与 pg_class 进行连接,则最好将连接限制为具有 reldatabase 等于当前数据库 OID 或零的行。

由于缓存管理器锁定不会被用于复制视图将显示的缓存状态数据,因此访问 pg_buffercache 视图对正常的缓存活动影响较小,但它不能在所有缓存区域提供一致的结果集。但是,我们确保每个缓存区域的信息是自洽的。

E.9.2. 示例输出

      regression=# SELECT n.nspname, c.relname, count(*) AS buffers
      FROM pg_buffercache b 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()))
      JOIN pg_namespace n ON n.oid = c.relnamespace
      GROUP BY n.nspname, c.relname
      ORDER BY 3 DESC
      LIMIT 10;

      nspname | relname | buffers
      ------------+------------------------+---------
      public | delete_test_table | 593
      public | delete_test_table_pkey | 494
      pg_catalog | pg_attribute | 472
      public | quad_poly_tbl | 353
      public | tenk2 | 349
      public | tenk1 | 349
      public | gin_test_idx | 306
      pg_catalog | pg_largeobject | 206
      public | gin_test_tbl | 188
      (10 rows)