• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
ffycxyw2274436 显示全部楼层 发表于 2021-8-14 14:34:42 |阅读模式 打印 上一主题 下一主题
我们都知道数据在缓存中访问远比在磁盘中访问速度要快,那么我们怎么在pg中将指定的数据加载到缓存中呢,这有点类似于Oracle的in-memory。
当然要留意并不是把数据加载到内存中就肯定是好的,由于相较于磁盘,内存总是有限的,所以一帮我们只是在特殊场所下将必要的数据加载到内存中来加快访问的速度。
我们可以利用pg_prewarm插件来将指定的表加载到OS Buffer大概pg shared buffer中。
安装:
  1. bill=# create extension pg_prewarm ;
  2. CREATE EXTENSION
复制代码
性能测试:

构建测试表t1,t2,分别插入1000W条测试数据
  1. bill=# create table t1(id int,info text);
  2. CREATE TABLE
  3. bill=# create table t2(id int,info text);
  4. CREATE TABLE
  5. bill=# insert into t1 select generate_series(1,10000000),md5(random()::text);
  6. INSERT 0 10000000
  7. bill=# insert into t2 select generate_series(1,10000000),md5(random()::text);
  8. INSERT 0 10000000
复制代码
测试前先清空shared_buffer,可以利用下面sql查察shared_buffer利用环境:
安装pg_buffercache插件:
  1. bill=# create extension pg_buffercache;
  2. CREATE EXTENSION
复制代码
查询shared_buffer利用环境:
  1. SELECT
  2.     c.relname,
  3.     count(*) AS buffers
  4. FROM pg_buffercache b
  5. INNER JOIN pg_class c
  6.    ON b.relfilenode = pg_relation_filenode(c.oid)
  7.     AND b.reldatabase IN (0, (SELECT oid FROM pg_database
  8. WHERE datname = current_database()))
  9. GROUP BY c.relname
  10. ORDER BY 2 DESC;
  11.                  relname                 | buffers
  12. -----------------------------------------+---------
  13. pg_attribute                            |      36
  14. pg_proc                                 |      27
  15. pg_class                                |      15
  16. pg_operator                             |      14
  17. pg_depend_reference_index               |      13
  18. pg_depend                               |      11
  19. pg_attribute_relid_attnum_index         |      10
  20. pg_proc_proname_args_nsp_index          |       9
  21. ......
复制代码
可以看到t1和t2表均不在shared_buffer中,我们来手动将t2表加载到shared_buffer中。
  1. bill=# SELECT pg_prewarm('t2');
  2. pg_prewarm
  3. ------------
  4.       83334
  5. (1 row)
复制代码
性能测试:

可以看到全表扫描t2表的性能要提升不少。
  1. bill=# explain analyze select * from t1;
  2.                                                     QUERY PLAN
  3. ------------------------------------------------------------------------------------------------------------------
  4. Seq Scan on t1  (cost=0.00..183334.80 rows=10000080 width=37) (actual time=0.060..772.902 rows=10000000 loops=1)
  5. Planning Time: 0.294 ms
  6. Execution Time: 1044.922 ms
  7. (3 rows)
  8. Time: 1045.722 ms (00:01.046)
  9. bill=# explain analyze select * from t2;
  10.                                                     QUERY PLAN
  11. ------------------------------------------------------------------------------------------------------------------
  12. Seq Scan on t2  (cost=0.00..183334.80 rows=10000080 width=37) (actual time=0.012..519.691 rows=10000000 loops=1)
  13. Planning Time: 0.280 ms
  14. Execution Time: 790.607 ms
  15. (3 rows)
  16. Time: 791.314 ms
复制代码
pg_prewarm别的先容:

下面紧张先容下pg_prewarm函数:
该函式的创建语句如下:
  1. CREATE FUNCTION pg_prewarm(regclass,
  2. mode text default buffer,
  3. fork text default main,
  4. first_block int8 default null,
  5. last_block int8 default null)
  6. RETURNS int8
  7. AS MODULE_PATHNAME, pg_prewarm
  8. 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内容请搜刮脚本之家以前的文章或继续欣赏下面的相关文章盼望大家以后多多支持脚本之家!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作