重启数据库后, 数据库缓存将被清空, 应用程序需要从硬盘读数据, 在开始的一段时间内, 会影响一定的性能; 当然, 之前有 pgfincore 工具,可以将一些访问频繁的表预先加载到 OS 缓存, 我在之前的 blog 提到过,具体参考pgfincore: cache data to OS cache , 9.4 之后, PostgreSQL 提供 pg_prewarm 模块, 可以将数据预先加载到数据库中.
pg_prewarm 概述
PostgreSQL 9.4 开始支持 pg_prewarm 模块, pg_prewarm 模块可以将数据预先加载到数据库缓存,也可以预先加载到操作系统缓存.
pg_prewarm 函数
pg_prewarm(regclass, mode text default ‘buffer’, fork text default ‘main’,
first_block int8 default null,
last_block int8 default null) RETURNS int8
备注: regclass 参数为数据库对像,通常情况为表名; modex 参数指加载模式,可选项有 ‘prefetch’, ‘read’,’buffer’, 默认为 ‘buffer’ 具体稍后介绍; fork 表示对像模式,可选项有 ‘main’, ‘fsm’, ‘vm’, 默认为 ‘main’, first_block 表示开始 prewarm 的数据块,last_block 表示最后 prewarm 的数据块.
pg_prewarm 加载模式
mode 参数指加载模式,可选项有 ‘prefetch’, ‘read’,’buffer’, 默认为 ‘buffer’.
- prefetch: 异步地将数据预加载到操作系统缓存;
- read: 最终结果和 prefetch 一样,但它是同步方式,支持所有平台.
- buffer: 将数据预加载到数据库缓存
pg_prewarm 演示
2.1 安装 pg_prewarm
1 |
[pg94@db1 ~]$ psql francs |
2.2 创建测试表
1 |
create table test_pre (id int4,name character varying(64),creat_time timestamp(6) without time zone); |
2.3 加载数据到数据库缓存
1 |
francs=> select pg_prewarm('test_pre','buffer'); |
备注: pg_prewarm 函数返回的是加载后的数据块数,这里返回的是 637 个块, 我设置的数据库块大小为 8 k. 如果表比较大, 也可以指定表的 block 范围.
总结
pg_prewarm 本文没做太多的测试,仅介绍用法, pg_prewarm 适合数据库需要重启的情况, 个人觉得特别适合加载访问频繁的小表.
参考
原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/238057.html