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 JSONB的匹配和交集问题
Sep 14 PostgreSQL
使用PostGIS完成两点间的河流轨迹及流经长度的计算(推荐)
Jan 18 PostgreSQL
Oracle配置dblink访问PostgreSQL的操作方法
Mar 21 PostgreSQL
PostgreSQL聚合函数介绍以及分组和排序
Apr 12 PostgreSQL
PostgreSQL基于pgrouting的路径规划处理方法
Apr 18 PostgreSQL
PostgreSQL出现死锁该如何解决
May 30 PostgreSQL
PostgreSQL之连接失败的问题及解决
May 08 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 中英文语言转换类代码
2011/08/11 PHP
php使用pdo连接报错Connection failed SQLSTATE的解决方法
2014/12/15 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
thinkPHP5.0框架引入Traits功能实例分析
2017/03/18 PHP
使用PHP json_decode可能遇到的坑与解决方法
2017/08/03 PHP
Mootools 1.2教程 滚动条(Slider)
2009/09/15 Javascript
用JavaScript玩转游戏物理(一)运动学模拟与粒子系统
2010/06/19 Javascript
web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
2013/01/09 Javascript
JS截取字符串常用方法详细整理
2013/10/28 Javascript
禁止页面刷新让F5快捷键及右键都无效
2014/01/22 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
jQuery插件实现大图全屏图片相册
2015/03/14 Javascript
jQuery实现新消息在网页标题闪烁提示
2015/06/23 Javascript
Node.js的npm包管理器基础使用教程
2016/05/26 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
Vue动态组件和异步组件原理详解
2019/05/06 Javascript
js实现鼠标点击页面弹出自定义文字效果
2019/12/24 Javascript
详谈Vue.js框架下main.js,App.vue,page/index.vue之间的区别
2020/08/12 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
2020/12/14 Vue.js
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
python实现忽略大小写对字符串列表排序的方法
2014/09/25 Python
Python编程中对文件和存储器的读写示例
2016/01/25 Python
python中关于for循环的碎碎念
2017/06/30 Python
python实现k-means聚类算法
2018/02/23 Python
浅谈Python大神都是这样处理XML文件的
2019/05/31 Python
Python3.7+tkinter实现查询界面功能
2019/12/24 Python
Python中使用threading.Event协调线程的运行详解
2020/05/02 Python
python--shutil移动文件到另一个路径的操作
2020/07/13 Python
Python pysnmp使用方法及代码实例
2020/08/24 Python
大学生表扬信范文
2014/01/09 职场文书
创先争优承诺书范文
2014/03/31 职场文书
2014收银员工作总结范文
2014/12/16 职场文书
运动会新闻报道稿
2015/07/22 职场文书
技术转让协议书
2016/03/19 职场文书
详解Python内置模块Collections
2022/03/22 Python