暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

扩展插件 -- 人大金仓sys_buffercache 扩展插件

原创 金仓数据库 2023-08-14
4747

sys_buffercache模块提供了一种实时检查共享缓冲区高速缓存中发生的内容接口。

一、插件详细信息

该插件具体信息如下:

test=# create extension sys_buffercache;
CREATE EXTENSION
test=# \dx+ sys_buffercache
Objects in extension "sys_buffercache"
        Object description
----------------------------------
 function sys_buffercache_pages()
 view sys_buffercache
(2 rows)

test=# \d+ sys_buffercache
                            View "public.sys_buffercache"
      Column      |   Type   | Collation | Nullable | Default | Storage | Description
------------------+----------+-----------+----------+---------+---------+-------------
 bufferid         | integer  |           |          |         | plain   |
 relfilenode      | oid      |           |          |         | plain   |
 reltablespace    | oid      |           |          |         | plain   |
 reldatabase      | oid      |           |          |         | plain   |
 relforknumber    | smallint |           |          |         | plain   |
 relblocknumber   | bigint   |           |          |         | plain   |
 isdirty          | boolean  |           |          |         | plain   |
 usagecount       | smallint |           |          |         | plain   |
 pinning_backends | integer  |           |          |         | plain   |
View definition:
 SELECT p.bufferid,
    p.relfilenode,
    p.reltablespace,
    p.reldatabase,
    p.relforknumber,
    p.relblocknumber,
    p.isdirty,
    p.usagecount,
    p.pinning_backends
   FROM sys_buffercache_pages() p(bufferid integer, relfilenode oid, reltablespace oid, reldatabase oid, relforknumber smallint, relblocknumber bigint, isdirty boolean, usagecount smallint, pinning_backends integer);

二、使用场景

共享缓存中的每个buffer在视图sys_buffercache都有一行。如果该buffer 未使用,除bufferid之外的所有字段均为null。全局system catalog对象在sys_buffercache.reldatabase 显示为0。

test=# SELECT setting FROM sys_settings WHERE name='shared_buffers'
test-# union all
test-# select count(*) from sys_buffercache;
 setting
---------
   16384
   16384
(2 rows)

查询share_buffer 缓存的对象信息:

test=#  SELECT c.relname, count(*) AS buffers
test-#               FROM sys_buffercache b INNER JOIN pg_class c
test-#               ON b.relfilenode = pg_relation_filenode(c.oid) AND
test-#                  b.reldatabase IN (0, (SELECT oid FROM pg_database WHERE datname = current_database()))
test-#               GROUP BY c.relname
test-#               ORDER BY 2 DESC
test-#               LIMIT 5;
            relname            | buffers
-------------------------------+---------
 test_recursive                |    2088
 test_recursive_random         |    1042
 ind_test_recursive_random_pid |     279
 pg_attribute                  |     122
 idx_t1                        |     100
(5 rows)

isdirty 表示该buffer 是否为脏块,可以通过比较checkpoint前后该buffer的值进行验证。

三、结论

对于sys_buffercache模块,需要注意的是,当访问sys_buffercache视图时,内部缓存区管理器会被锁住足够长时间来拷贝视图将显示的所有缓存区状态数据。这确保了该视图会产生一个一致的结果集合,而不会不必要地长时间阻塞普通的缓存区活动。但如果经常读取这个视图还是会对数据库性能产生一些影响。

最后修改时间:2023-12-21 09:27:03
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论