PostgreSQL 9.4 : Pg_prewarm 数据缓存预加载模块

重启数据库后, 数据库缓存将被清空, 应用程序需要从硬盘读数据, 在开始的一段时间内, 会影响一定的性能; 当然, 之前有 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
2
3
4
5
6
[pg94@db1 ~]$ psql francs
psql (9.4beta1)
Type "help" for help.

francs=# create extension pg_prewarm;
CREATE EXTENSION

2.2 创建测试表

1
2
3
4
5
6
7
8
9
10
11
francs=> create table test_pre (id int4,name character varying(64),creat_time timestamp(6) without time zone);
CREATE TABLE

francs=> insert into test_pre select generate_series(1,100000),generate_series(1,100000)|| '_pre',clock_timestamp();
INSERT 0 100000

francs=> select pg_size_pretty(pg_relation_size('test_pre'));
pg_size_pretty
----------------
5096 kB
(1 row)

2.3 加载数据到数据库缓存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
francs=>  select pg_prewarm('test_pre','buffer');
pg_prewarm
------------
637
(1 row)

francs=> select current_setting('block_size');
current_setting
-----------------
8192
(1 row)

francs=> select 637*8;
?column?
----------
5096
(1 row)

备注: pg_prewarm 函数返回的是加载后的数据块数,这里返回的是 637 个块, 我设置的数据库块大小为 8 k. 如果表比较大, 也可以指定表的 block 范围.

总结

pg_prewarm 本文没做太多的测试,仅介绍用法, pg_prewarm 适合数据库需要重启的情况, 个人觉得特别适合加载访问频繁的小表.

参考

原创文章,作者:306829225,如若转载,请注明出处:https://blog.ytso.com/238057.html

(0)
上一篇 2022年1月30日
下一篇 2022年1月30日

相关推荐

发表回复

登录后才能评论