PostgreSQL数据库扩展包——pg_buffercache使用
概述pg_buffercache模块提供了一种实时检测共享缓冲区的方法。这个模块提供了一个C函数:pg_buffercache_pages,它返回一个记录的集合和一个视图:pg_buffercache,它包装了这个函数来更方便的使用。默认情况下,公共访问会从这两者中撤回,来预防潜在的安全问题。pg_buffercache这个视图中各列定义的详细解释如下:名称描述bufferidID范围是1到sha
概述
pg_buffercache模块提供了一种实时检测共享缓冲区的方法。这个模块提供了一个C函数:pg_buffercache_pages,它返回一个记录的集合和一个视图:pg_buffercache,它包装了这个函数来更方便的使用。默认情况下,公共访问会从这两者中撤回,来预防潜在的安全问题。
pg_buffercache这个视图中各列定义的详细解释如下:
名称 | 描述 |
---|---|
bufferid | ID范围是1到shared_buffers |
relfilenode | 关系的文件节点号 |
reltablespace | 关系的表空间OID |
reldatabase | 关系的数据库OID |
relforknumber | 关系内的分叉树 |
relblocknumber | 关系内的页面数 |
isdirty | 页面是否为脏 |
usagecount | clock-sweep访问计数 |
pinning_backends | 对这个缓冲区加pin的后端数量 |
共享缓存中的每个缓冲区都有一行。未使用的缓冲区除了bufferid以外的所有列为null。共享系统目录被显示为属于数据库零。因为缓存被所有的数据库共享,通常会有关系中的一些页面不属于当前的数据库。这意味着对许多行来说,在pg_class中可能不会有匹配的连接行,或者甚至可能会有错误连接。如果你试图连接pg_class,一个好的办法就是将连接限制为reldatabase等于当前数据库的OID或者为零的行。
当访问pg_buffercache视图时,内部缓冲区管理器会锁住足够长的时间来拷贝所有这个视图会展示的缓冲区状态数据。这确保了这个视图产生一个一致的结果集,同时不会不必要的长时间阻碍正常的缓冲区活动。虽然如此,但是如果这个视图被频繁读取的话,会对数据库性能产生一些影响。
测试
登录psql,并创建两个数据库:create database test; create database mydb;
连接到测试数据库,并执行:create extension pg_buffercache;
在shell提示符中,进入/usr/local/pgsql/share/extension目录:
连接到数据库,看看缓冲区缓存的内容:
[postgres@MyCentOS extension]$ psql -d test
test=# SELECT DISTINCT reldatabase FROM pg_buffercache;
reldatabase
--------------
12896
0
24741
在缓存中找到两个数据库的某些部分。带0的记录表示缓存区尚未使用:
test=# \! oid2name
All databases:
Oid Database Name Tablespace
-----------------------------------
16440 mydb pg_default
12896 postgres pg_default
12891 template0 pg_default
1 template1 pg_default
24741 test pg_default
可以用一些其他视图再次连接,以获得更清晰的结果:select c.relname, count(*) as buffers from pg_class c join pg_buffercache b on b.relfilenode = c.relfilenode inner join pg_database d on (b.reldatabase=d.oid and d.datname=current_database()) group bu c.relname order by 2 desc;
可以看到主要是数据字典视图。许多数据字典表和视图会提供各种对象、对象类型、权限等的相关信息。这些为集群共同管理者记录活动;pg_class是其中一个类目表。这个表的其中一列是relname。尽管它看上去像是要存储关系/表名称,它也可以为其他对象类型存储数据。我们应该将它与列relkind一起使用。列relkind告诉我们记录指向的对象类型。relkind可能包括这些值,如r表、i索引、s序列、v视图等。
删除查询中relname,并修改
尝试使用用户创建的表填充缓冲区。创建一个表,并插入一条记录。
可以重复查询,检查缓冲区是否包含新创建的表及其序列:
对查询稍作修改,isdirty标记是f:
更新数据,重复查询缓存区,页面表脏:
强制设置检查点:CHECKPOINT;
重复查询,页面不为脏:
更多推荐
所有评论(0)