PostgreSQL 13.1 中文入门教程 PostgreSQL pg_buffercache

2024-02-25 开发教程 PostgreSQL 13.1 中文入门教程 匿名 4
F.24.1. pg_buffercache视图
F.24.2. 样例输出

pg_buffercache模块提供了一种方法实时检查共享缓冲区。

该模块提供了一个 C 函数pg_buffercache_pages,它返回一个记录的集合,外加一个包装了该函数以便于使用的视图pg_buffercache

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

F.24.1. pg_buffercache视图

视图显示的列的定义如表 F.15所示。

表 F.15. pg_buffercache

列类型

描述

bufferidinteger

ID,在范围 1..shared_buffers

relfilenodeoid(references pg_class.relfilenode)

关系的文件结点编号

reltablespaceoid(references pg_tablespace.oid)

关系的表空间 OID

reldatabaseoid(references pg_database.oid)

关系的数据库 OID

relforknumbersmallint

关系内的分叉数,见include/common/relpath.h

relblocknumberbigint

关系内的页面数

isdirtyboolean

页面是否为脏?

usagecountsmallint

Clock-sweep 访问计数

pinning_backendsinteger

对这个缓冲区加 pin 的后端数量

共享缓存中的每一个缓冲区都有一行。没有使用的缓冲区的行中只有bufferid为非空。共享的系统目录被显示为属于数据库零。

因为缓冲是所有数据库共享的,通常会有不属于当前数据库的关系的页面。这意味着对于一些行在pg_class中可能不会有匹配的连接行,或者甚至有错误的连接。如果你试图与pg_class连接,将连接限制于reldatabase等于当前数据库 OID 或零的行是一个好主意。

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

F.24.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
public | spgist_text_tbl | 182
(10 rows)