pg_buffercache
模块提供了一种方法实时检查共享缓冲区。
该模块提供了一个 C 函数pg_buffercache_pages
,它返回一个记录的集合,外加一个包装了该函数以便于使用的视图pg_buffercache
。
默认情况下,使用受限于超级用户和具有pg_monitor
角色特权的角色。可以使用GRANT
授予其他用户访问权限。
pg_buffercache
视图视图显示的列的定义如表 F.15所示。
表 F.15. pg_buffercache
列
列类型 描述 |
---|
ID,在范围 1.. |
关系的文件结点编号 |
关系的表空间 OID |
关系的数据库 OID |
关系内的分叉数,见 |
关系内的页面数 |
页面是否为脏? |
Clock-sweep 访问计数 |
对这个缓冲区加 pin 的后端数量 |
共享缓存中的每一个缓冲区都有一行。没有使用的缓冲区的行中只有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 public | spgist_text_tbl | 182 (10 rows)
Mark Kirkwood <markir@paradise.net.nz>
设计建议: Neil Conway <neilc@samurai.com>
调试建议: Tom Lane <tgl@sss.pgh.pa.us>