PostgreSQL将数据加载到buffer cache中操作方法
我们都知道数据在缓存中访问远比在磁盘中访问速度要快,那么我们怎么在pg中将指定的数据加载到缓存中呢,这有点类似于Oracle的in-memory。 当然要注意并不是把数据加载到内存中就一定是好的,因为相较于磁盘,内存总是有限的,所以一帮我们只是在特殊场合下将需要的数据加载到内存中来加快访问的速度。 我们可以使用pg_prewarm插件来将指定的表加载到OS Buffer或者pg shared buffer中。 安装: bill=# create extension pg_prewarm ;
性能测试: 构建测试表t1,t2,分别插入1000W条测试数据 bill=# create table t1(id int,info text);
测试前先清空shared_buffer,可以使用下面sql查看shared_buffer使用情况: 安装pg_buffercache插件: bill=# create extension pg_buffercache;
查询shared_buffer使用情况: SELECT
可以看到t1和t2表均不在shared_buffer中,我们来手动将t2表加载到shared_buffer中。 bill=# SELECT pg_prewarm('t2');
性能测试: 可以看到全表扫描t2表的性能要提升不少。 bill=# explain analyze select * from t1; Time: 1045.722 ms (00:01.046) bill=# explain analyze select * from t2; Time: 791.314 mspg_prewarm其它介绍: 下面主要介绍下pg_prewarm函数: 该函式的创建语句如下: CREATE FUNCTION pg_prewarm(regclass,
参数如下: 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.jb51.net/article/209711.htm (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |