PostgreSQL将数据加载到buffer cache中操作方法


Posted in PostgreSQL onApril 16, 2021

我们都知道数据在缓存中访问远比在磁盘中访问速度要快,那么我们怎么在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 ms

pg_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正好可以满足这个需求。

参考链接:

https://www.postgresql.org/docs/13/pgprewarm.html
https://www.postgresql.org/docs/13/pgbuffercache.html

到此这篇关于PostgreSQL将数据加载到buffer cache中的文章就介绍到这了,更多相关PostgreSQL数据加载buffer cache内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PostgreSQL 相关文章推荐
如何使用PostgreSQL进行中文全文检索
May 27 PostgreSQL
浅谈PostgreSQL表分区的三种方式
Jun 29 PostgreSQL
postgresql使用filter进行多维度聚合的解决方法
Jul 16 PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 PostgreSQL
Oracle配置dblink访问PostgreSQL的操作方法
Mar 21 PostgreSQL
PostgreSQL并行计算算法及参数强制并行度设置方法
Apr 07 PostgreSQL
PostgreSQL数据库创建并使用视图以及子查询
Apr 11 PostgreSQL
PostgreSQL数据库去除重复数据和运算符的基本查询操作
Apr 12 PostgreSQL
PostgreSQL逻辑复制解密原理解析
Sep 23 PostgreSQL
PostgreSQL之连接失败的问题及解决
May 08 PostgreSQL
PostgreSQL存储过程实用脚本(二):创建函数入门
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
Centos环境下Postgresql 安装配置及环境变量配置技巧
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
如何使用PostgreSQL进行中文全文检索
May 27 #PostgreSQL
postgresql无序uuid性能测试及对数据库的影响
Jun 11 #PostgreSQL
postgres之jsonb属性的使用操作
Jun 23 #PostgreSQL
You might like
PHP 网页过期时间的控制代码
2009/06/29 PHP
利用PHP实现图片等比例放大和缩小的方法详解
2013/06/06 PHP
php遍历CSV类实例
2015/04/14 PHP
thinkphp自带验证码全面解析
2016/09/18 PHP
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
PHP+jQuery实现随意拖动层并即时保存拖动位置
2015/04/30 Javascript
jQuery中 attr() 方法使用小结
2015/05/03 Javascript
jquery SweetAlert插件实现响应式提示框
2015/08/18 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
2016/05/05 Javascript
AngularJS基础 ng-cloak 指令简单示例
2016/08/01 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
JS正则表达式判断有效数实例代码
2017/03/13 Javascript
vue2.0项目实现路由跳转的方法详解
2018/06/21 Javascript
JavaScript this使用方法图解
2020/02/04 Javascript
python的Template使用指南
2014/09/11 Python
Python中实现三目运算的方法
2015/06/21 Python
Python Property属性的2种用法
2015/06/21 Python
Python的CGIHTTPServer交互实现详解
2018/02/08 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
用Python绘制漫步图实例讲解
2020/02/26 Python
Python动态强类型解释型语言原理解析
2020/03/25 Python
关于Django Models CharField 参数说明
2020/03/31 Python
20行Python代码实现视频字符化功能
2020/04/13 Python
Python selenium 加载并保存QQ群成员,去除其群主、管理员信息的示例代码
2020/05/28 Python
Python中的流程控制详解
2021/02/18 Python
canvas环形倒计时组件的示例代码
2018/06/14 HTML / CSS
聪明的粉丝购买门票的地方:TickPick
2018/03/09 全球购物
爱岗敬业演讲稿范文
2014/01/14 职场文书
销售人员获奖感言
2014/02/05 职场文书
我为自己代言广告词
2014/03/18 职场文书
计算机网络专业自荐书
2014/06/09 职场文书
参赛口号
2014/06/16 职场文书
争先创优活动总结
2014/08/27 职场文书
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
2014年残疾人工作总结
2014/12/06 职场文书
升职自我推荐信范文
2015/03/25 职场文书