Postgresql 中文操作指南
F.27. pg_buffercache — inspect PostgreSQL buffer cache state #
pg_buffercache 模块提供了一种方式,用于检查在共享缓冲区高速缓存中正在实时发生的事情。
此模块提供 pg_buffercache_pages() 函数(包装在 pg_buffercache 视图中),pg_buffercache_summary() 函数和 pg_buffercache_usage_counts() 函数。
pg_buffercache_pages() 函数返回一组记录,每一行描述了一个共享缓冲区条目的状态。pg_buffercache 视图包装函数,为了便于使用。
pg_buffercache_summary() 函数返回一个行,总结共享缓冲区高速缓存的状态。
pg_buffercache_usage_counts() 函数返回一组记录,每行描述具有给定使用计数的缓冲区数。
默认情况下,仅超级用户和具有 pg_monitor 角色权限的角色可以访问。可以使用 GRANT 授予其他人访问权限。
F.27.1. The pg_buffercache View #
视图公开的列的定义显示在 Table F.15中。
Table F.15. pg_buffercache Columns
Column Type 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 关系中的分叉号; 见 common/relpath.h |
relblocknumber bigint 关系中的页号 |
isdirty boolean 该页是否已更改? |
usagecount smallint Clock-sweep access count |
pinning_backends integer 固定此缓冲区的后端数量 |
共享缓存中每一缓冲区都有一行。未使用的缓冲区的所有字段都显示为空,除了 bufferid。系统共享目录显示为数据库零。
因为此缓存由所有数据库共享,所以通常会有不属于当前数据库的关系的页面。这意味着 pg_class 中某些行的匹配联接行可能不存在,或者甚至可能会有错误联接。如果你试图针对 pg_class 联接,最好是将联接限制到具有 reldatabase 的行,该行等于当前数据库的 OID 或零。
由于没有获得缓冲区管理器锁来复制视图将显示的缓冲器状态数据,所以访问 pg_buffercache 视图对正常缓冲区活动的影响更小,但是它不会提供跨所有缓冲区的一致的结果集。然而,我们确保每个缓冲区的信息是自洽的。
F.27.2. The pg_buffercache_summary() Function #
函数公开的列的定义显示在 Table F.16中。
Table F.16. pg_buffercache_summary() Output Columns
Column Type Description |
buffers_used int4 已用共享缓冲区数量 |
buffers_unused int4 未用共享缓冲区数量 |
buffers_dirty int4 已更改共享缓冲区数量 |
buffers_pinned int4 已固定共享缓冲区数量 |
usagecount_avg float8 已用共享缓冲区的平均使用计数 |
pg_buffercache_summary() 功能返回一行,概括所有共享缓冲区的状态。 pg_buffercache 视图提供了类似且更详细的信息,但 pg_buffercache_summary() 要便宜得多。
与 pg_buffercache 视图一样,pg_buffercache_summary() 不会获取缓冲区管理器锁。因此,并发活动可能会导致结果中的小错误。
F.27.3. The pg_buffercache_usage_counts() Function #
函数公开的列的定义显示在 Table F.17中。
Table F.17. pg_buffercache_usage_counts() Output Columns
Column Type Description |
usage_count int4 可能的缓冲区使用计数 |
buffers int4 使用计数为该计数的缓冲区数量 |
dirty int4 使用计数为该计数的已更改缓冲区数量 |
pinned int4 使用计数为该计数的已固定缓冲区数量 |
pg_buffercache_usage_counts() 函数返回一组行,汇总所有共享缓冲区的状态,并汇总可能的用法计数值。pg_buffercache 视图提供了类似且更详细的信息,但 pg_buffercache_usage_counts() 的负担明显较轻。
与 pg_buffercache 视图一样,pg_buffercache_usage_counts() 不会获取缓冲区管理器锁。因此,并发活动可能会导致结果中的小错误。
F.27.4. Sample Output #
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)
regression=# SELECT * FROM pg_buffercache_summary();
buffers_used | buffers_unused | buffers_dirty | buffers_pinned | usagecount_avg
--------------+----------------+---------------+----------------+----------------
248 | 2096904 | 39 | 0 | 3.141129
(1 row)
regression=# SELECT * FROM pg_buffercache_usage_counts();
usage_count | buffers | dirty | pinned
-------------+---------+-------+--------
0 | 14650 | 0 | 0
1 | 1436 | 671 | 0
2 | 102 | 88 | 0
3 | 23 | 21 | 0
4 | 9 | 7 | 0
5 | 164 | 106 | 0
(6 rows)
F.27.5. Authors #
Mark Kirkwood < link:mailto:markir@paradise.net.nz[markir@paradise.net.nz]>
设计建议: Neil Conway < link:mailto:neilc@samurai.com[neilc@samurai.com]>
调试建议: Tom Lane < link:mailto:tgl@sss.pgh.pa.us[tgl@sss.pgh.pa.us]>