dns查询-PostgreSQL将数据加载到buffer cache中操作方法

dns查询服务器数据在缓存中拜访远比在磁盘中拜访速度要快,那么咱们怎么在pg中将指定的数据加载到缓存中呢,这有点类似于Oracle的in-memory。

当然要注意并不是把数据加载到内存中就一定是好的,由于相较于磁盘,内存总是有限的,所以一帮咱们只是在特殊场合下将需求的数据加载到内存中来加速拜访的速度。

咱们能够运用pg_prewarm插件来将指定的表加载到OS Buffer或许pg shared buffer中。

安装:

bill=# create extension pg_prewarm ;
CREATE EXTENSION

功能测验:

构建测验表t1,t2,别离插入1000W条测验数据

bill=# create table t1(id int,info text);
CREATE TABLE
bill=# create table t2(id int,info text);
CREATE TABLE
bill=# insert into t1 select generate_series(1,10000000),md5(random()::text);
INSERT 0 10000000
bill=# insert into t2 select generate_series(1,10000000),md5(random()::text);
INSERT 0 10000000

测验前先清空shared_buffer,能够运用下面sql查看shared_buffer运用情况:

安装pg_buffercache插件:

bill=# create extension pg_buffercache;
CREATE EXTENSION

查询shared_buffer运用情况:

SELECT
c.relname,
count(*) AS buffers
FROM pg_buffercache b
INNER 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()))
GROUP BY c.relname
ORDER BY 2 DESC;
relname                 | buffers
—————————————–+———
pg_attribute                            |      36
pg_proc                                 |      27
pg_class                                |      15
pg_operator                             |      14
pg_depend_reference_index               |      13
pg_depend                               |      11
pg_attribute_relid_attnum_index         |      10
pg_proc_proname_args_nsp_index          |       9
……

能够看到t1和t2表均不在shared_buffer中,咱们来手动将t2表加载到shared_buffer中。

bill=# SELECT pg_prewarm(‘t2’);
pg_prewarm
————
83334
(1 row)

功能测验:

能够看到全表扫描t2表的功能要提高不少。

bill=# explain analyze select * from t1;
QUERY PLAN
——————————————————————————————————————
Seq Scan on t1  (cost=0.00..183334.80 rows=10000080 width=37) (actual time=0.060..772.902 rows=10000000 loops=1)
Planning Time: 0.294 ms
Execution Time: 1044.922 ms
(3 rows)

Time: 1045.722 ms (00:01.046)

bill=# explain analyze select * from t2;
QUERY PLAN
——————————————————————————————————————
Seq Scan on t2  (cost=0.00..183334.80 rows=10000080 width=37) (actual time=0.012..519.691 rows=10000000 loops=1)
Planning Time: 0.280 ms
Execution Time: 790.607 ms
(3 rows)

Time: 791.314 mspg_prewarm其它介绍:

下面主要介绍下pg_prewarm函数:

该函式的创建语句如下:

CREATE FUNCTION pg_prewarm(regclass,
mode text default buffer,
fork text default main,
first_block int8 default null,
last_block int8 default null)
RETURNS int8
AS MODULE_PATHNAME, pg_prewarm
LANGUAGE C

参数如下:

regclass:要做prewarm的表名

mode:prewarm形式。prefetch表明异步预取到os cache;read表明同步预取;buffer表明同步读入PG的shared buffer

fork:relation fork的类型。一般用main,其他类型有visibilitymap和fsm

first_block & last_block:开端和完毕块号。表的first_block=0,last_block可通过pg_class的relpages字段获得

RETURNS int8:函数返回pg_prewarm处理的block数目(整型)

可能有人会想:我直接将表select *全表查询一遍不就能够将数据加载到缓存中了嘛,为什么还需求运用pg_prewarm呢?由于对于巨细超越shared_buffer/4的表进行全表扫描时,pg一般不会运用全部的shared_buffer,而是只运用很少一部分的shared_buffer。所以,将大表加载到缓存中不能用一个查询来直接完成的,而pg_prewarm正好能够满意这个需求。