PostgreSQL将数据加载到buffer cache中操作流程

我们都知道数据在缓存中访问远比在磁盘中访问速度要快,那么我们怎么在pg中将指定的数据加载到缓存中呢,这有点类似于Oracle的in-memory。
 
ASP站长网当然要注意并不是把数据加载到内存中就一定是好的,因为相较于磁盘,内存总是有限的,所以一帮我们只是在特殊场合下将需要的数据加载到内存中来加快访问的速度。
 
我们可以使用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

dawei

【声明】:九江站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。