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解析URL的方法
Aug 02 PostgreSQL
PostgreSQL自动更新时间戳实例代码
Nov 27 PostgreSQL
Oracle配置dblink访问PostgreSQL的操作方法
Mar 21 PostgreSQL
PostgreSQL 插入INSERT、删除DELETE、更新UPDATE、事务transaction
Apr 12 PostgreSQL
PostgreSQL数据库去除重复数据和运算符的基本查询操作
Apr 12 PostgreSQL
postgreSQL数据库基础知识介绍
Apr 12 PostgreSQL
PostgreSQL出现死锁该如何解决
May 30 PostgreSQL
postgresql之greenplum字符串去重拼接方式
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 n个不重复的随机数生成代码
2009/06/23 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
免费空间广告万能消除代码
2006/09/04 Javascript
JavaScript的面向对象方法以及差别
2008/03/31 Javascript
jquery 跨域访问问题解决方法(笔记)
2011/06/08 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
js的隐含参数(arguments,callee,caller)使用方法
2014/01/28 Javascript
Javascript表单验证要注意的事项
2014/09/29 Javascript
jQuery实现tag便签去重效果的方法
2015/01/20 Javascript
纯JavaScript代码实现移动设备绘图解锁
2015/10/16 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
nodejs简单实现操作arduino
2016/09/25 NodeJs
原生js实现对Ajax的封装(仿jquery)
2017/01/22 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
jQuery设计思想
2017/03/07 Javascript
JS实现标签滚动切换效果
2017/12/25 Javascript
vue select二级联动第二级默认选中第一个option值的实例
2018/01/10 Javascript
你可能不知道的CORS跨域资源共享
2019/03/13 Javascript
Vue开发之封装分页组件与使用示例
2019/04/25 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
JS中FileReader类实现文件上传及时预览功能
2020/03/27 Javascript
js实现搜索提示框效果
2020/09/05 Javascript
[54:26]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第一场 12.10
2020/12/12 DOTA
Python实现螺旋矩阵的填充算法示例
2017/12/28 Python
python调用staf自动化框架的方法
2018/12/26 Python
Pytorch Tensor基本数学运算详解
2019/12/30 Python
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
巴西本土电商平台:Americanas
2020/06/21 全球购物
电子商务专业学生职业生涯规划
2014/03/07 职场文书
中秋节慰问信
2015/02/15 职场文书
大学生个人学习总结
2015/02/15 职场文书
旅游投诉信范文
2015/07/02 职场文书
装修安全责任协议书
2016/03/22 职场文书
应届生个人的求职(自荐信范文2篇)
2019/08/23 职场文书
Vue3.0中Ref与Reactive的区别示例详析
2021/07/07 Vue.js