lt_buffercache
模块提供了实时查看共享缓存区中发生的情况的方法。
该模块提供了一个 C 函数 pg_buffercache_pages
,它返回一组记录,以及一个视图 pg_buffercache
,该视图将函数包装为方便使用。
默认情况下,仅超级用户和 pg_monitor
角色的成员可以使用。可以使用 GRANT
授予其他用户访问权限。
pg_buffercache
视图
该视图公开的列的定义在 Table E.2 中显示。
Table E.2.
pg_buffercache
列
列类型 描述 |
---|
ID,范围为 1.. |
关系的文件节点号 |
关系的表空间 OID |
关系的数据库 OID |
关系内部的 Fork 编号;请参见 |
关系中的页面编号 |
页面是否是脏页? |
时钟算法扫描访问计数 |
固定此缓存区的后端数量 |
共享缓存中每个缓存区都有一行记录。未使用的缓存区所有字段均为空,仅 bufferid
不为空。共享系统目录显示为属于数据库零。
由于缓存是由所有数据库共享的,因此通常会有来自不属于当前数据库的表的页面。这意味着有些行可能在 pg_class
中没有匹配的连接行,或者甚至可能存在错误的连接。如果您尝试与
pg_class
进行连接,则最好将连接限制为具有 reldatabase
等于当前数据库 OID 或零的行。
由于缓存管理器锁定不会被用于复制视图将显示的缓存状态数据,因此访问 pg_buffercache
视图对正常的缓存活动影响较小,但它不能在所有缓存区域提供一致的结果集。但是,我们确保每个缓存区域的信息是自洽的。
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)