On this page
F.24. pg_buffercache
pg_buffercache
模块提供了一种实时检查共享缓冲区高速缓存中发生的情况的方法。
该模块提供了一个 C 函数pg_buffercache_pages
,该函数返回一组记录,以及一个视图pg_buffercache
,该视图包装了该函数以方便使用。
默认情况下,使用仅限于超级用户和pg_monitor
角色的成员。可以使用GRANT
将访问权限授予其他人。
F.24.1. pg_buffercache 视图
该视图公开的列的定义在Table F.15中显示。
表 F.15.pg_buffercache
列
Name | Type | References | Description |
---|---|---|---|
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 |
关系内的货叉号;见include/common/relpath.h |
|
relblocknumber |
bigint |
关系内的页码 | |
isdirty |
boolean |
页面脏了吗? | |
usagecount |
smallint |
时钟扫描访问计数 | |
pinning_backends |
integer |
固定此缓冲区的后端数 |
共享缓存中的每个缓冲区都有一行。显示未使用的缓冲区,除bufferid
之外的所有字段均为空。共享的系统目录显示为属于数据库零。
因为所有数据库都共享高速缓存,所以通常会有不属于当前数据库的关系中的页面。这意味着某些行中的pg_class
中可能没有匹配的联接行,甚至可能有不正确的联接。如果您要针对pg_class
进行联接,则最好将联接限制为reldatabase
等于当前数据库的 OID 或零的行。
由于不使用缓冲区 Management 器锁来复制视图将显示的缓冲区状态数据,因此访问pg_buffercache
视图对正常缓冲区活动的影响较小,但不会在所有缓冲区中提供一致的结果集。但是,我们确保每个缓冲区的信息都是自洽的。
F.24.2. samples 输出
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)
F.24.3. Authors
马克·柯克伍德<markir@paradise.net.nz>
设计建议:Neil Conway <neilc@samurai.com>
调试建议:Tom Lane <tgl@sss.pgh.pa.us>