【赵渝强老师】PostgreSQL的数据预热扩展pg_prewarm

本文涉及的产品
云数据库 PolarDB MySQL 版,列存表分析加速 4核8GB
RDS Agent(兼容OpenClaw),2核4GB
PolarClaw,2核4GB
简介: 本文详解PostgreSQL扩展pg_prewarm,支持手工与自动两种数据预热方式:手工调用pg_prewarm()函数将表数据预加载至缓冲区;自动模式通过后台进程周期记录并重启时恢复热点数据,显著提升查询性能。

b445.png

PostgreSQL从开始就设计成可以扩展的。因此,加载到数据库的扩展可以像它们被打包在数据库里一样。PostgreSQL源代码的contrib/目录里面有大量这种扩展。该目录下的README文件包含PostgreSQL扩展的相应帮助信息。它们包含转换工具、全文索引、XML工具、额外的数据类型和索引方法等等。PostgreSQL也支持单独开发额外的扩展。


这里重点介绍一下数据预热扩展pg_prewarm。pg_prewarm扩展可以把关系数据预存入操作系统缓冲区或者PostgreSQL缓冲区,从而提高PostgreSQL数据库读取数据的效率。PostgreSQL数据库可以通过两种不同的方式进行数据预热,即:数据的手工预热和数据的自动预热。视频讲解如下:


一、 安装pg_prewarm扩展


在使用数据预热功能之前需要先按照pg_prewarm扩展,下面是具体的安装步骤。

(1)进入PostgreSQL源码目录下的contrib/pg_prewarm目录。

cd postgresql-15.3/contrib/pg_prewarm/

(2)编译并安装pg_prewarm。

make 
make install

(3)修改postgresql.conf参数文件中的shared_preload_libraries参数。

shared_preload_libraries = 'file_fdw,postgres_fdw,pg_prewarm'

(4)重启PostgreSQL数据库服务器。

(5)创建pg_prewarm扩展。

postgres=# create extension pg_prewarm;

(6)查看pg_prewarm扩展的详细信息。

postgres=# \dx+ pg_prewarm 
# 输出的信息如下:
           Objects in extension "pg_prewarm"
                  Object description                   
-------------------------------------------------------
 function autoprewarm_dump_now()
 function autoprewarm_start_worker()
 function pg_prewarm(regclass,text,text,bigint,bigint)
(3 rows)
# 从这里的输出信息可以看出,pg_prewarm扩展自动创建了三个与数据预热相关的函数。


二、 数据的手工预热

数据的手工预热主要是通过函数pg_prewarm()完成,下面展示了该函数的申明。

pg_prewarm(
 regclass, 
 mode text default 'buffer', 
 fork text default 'main',
 first_block int8 default null,
 last_block int8 default null) 
RETURNS int8
# 这里最重要的参数就是第一个参数regclass,它表示要进行预热的表名,函数的返回值是预热块的数量。


下面通过一个具体的示例来演示如何使用pg_prewarm()函数。

(1)创建一张表用于进行测试。

postgres=# create table prewarmtable(pid int,pname varchar(20));

(2)往表中插入5000万条测试数据。

postgres=# insert into prewarmtable select n,'name'||n from generate_series(1,50000000) n;

(3)执行一条简单的查询语句,并查看相应的执行计划。

postgres=# explain (analyze,buffers,timing) select * from prewarmtable;
# 输出的信息如下:
                                  QUERY PLAN     
--------------------------------------------------------
 Seq Scan on prewarmtable  
 (cost=0.00..808940.56 rows=50010856 width=16) 
 (actual time=0.035..5339.230 rows=50000000 loops=1)
   Buffers: shared read=308832
 Planning:
   Buffers: shared hit=14 read=7
 Planning Time: 0.347 ms
 Execution Time: 8385.500 ms
(6 rows)
# 从输出的结果可以看出,此时从磁盘上读取了308832数据块。

(4)再次执行同样的查询语句,并查看相应的执行计划。

postgres=# explain (analyze,buffers,timing) select * from prewarmtable;
# 输出的信息如下:
                                  QUERY PLAN     
--------------------------------------------------------
 Seq Scan on prewarmtable  
 (cost=0.00..808940.56 rows=50010856 width=16) 
 (actual time=0.035..5304.973 rows=50000000 loops=1)
   Buffers: shared hit=32 read=308800
 Planning Time: 0.030 ms
 Execution Time: 8351.421 ms
(4 rows)
# 从输出的结果可以看出,第二次读取数据时有32个数据块被执行了缓存。


(5)重启PostgreSQL数据库服务器,以达到清空缓存的目的。

(6)使用pg_prewarm()函数预热表prewarmtable的数据。

postgres=# select pg_prewarm('prewarmtable');
 pg_prewarm 
------------
     308832
(1 row)

(7)再次执行同样的查询语句,并查看相应的执行计划。

postgres=# explain (analyze,buffers,timing) select * from prewarmtable;
# 输出的信息如下:
                                  QUERY PLAN     
--------------------------------------------------------
 Seq Scan on prewarmtable  
 (cost=0.00..808940.56 rows=50010856 width=16) 
 (actual time=0.017..5470.853 rows=50000000 loops=1)
   Buffers: shared hit=16308 read=292524
 Planning:
   Buffers: shared hit=3 read=3
 Planning Time: 0.120 ms
 Execution Time: 8620.384 ms
(6 rows)
# 从输出的结果可以看出,由于使用了pg_prewarm()函数预热数据
# 此时读取数据时有16308个数据块被执行了缓存。


三、 数据的自动预热


当pg_prewarm扩展安装配置成功后,PostgreSQL数据库服务器会周期性地把共享内存中的内容记录在一个名为autoprewarm.blocks的文件中,并在数据库服务器重新启动时读取该文件以达到数据预热的目的。文件autoprewarm.blocks默认保存在$PGDATA目录下,如下所示。

[postgres@mydb pgsql]$ pwd
/home/postgres/training/pgsql
[postgres@mydb pgsql]$ ll data/autoprewarm.blocks 
-rw------- 1 postgres postgres 425037 ...  data/autoprewarm.blocks


下面通过一个简单的测试来验证重启数据库服务器后,数据是否会自动进行预热。

(1)重启PostgreSQL数据库服务器,以达到清空缓存的目的。

(2)执行一条简单的查询语句,并查看相应的执行计划。

postgres=# explain (analyze,buffers,timing) select * from prewarmtable;
# 输出的信息如下:
                                  QUERY PLAN     
--------------------------------------------------------
 Seq Scan on prewarmtable  
 (cost=0.00..808940.56 rows=50010856 width=16) 
 (actual time=0.026..8544.466 rows=50000000 loops=1)
   Buffers: shared hit=16191 read=292641
 Planning:
   Buffers: shared hit=18 read=3
 Planning Time: 0.461 ms
 Execution Time: 13426.254 ms
(6 rows)
# 从输出的结果可以看出
# 此时读取数据时有16191个数据块被执行了自动预热加载到了缓存中。


在默认情况下,pg_prewarm扩展会每隔5分钟将内存中的数据写入文件autoprewarm.blocks中,这是由参数pg_prewarm.autoprewarm_interval决定,如下所示。

postgres=# show pg_prewarm.autoprewarm_interval ;
# 输出的信息如下:
 pg_prewarm.autoprewarm_interval 
---------------------------------
 5min
(1 row)


当重启PostgreSQL数据库服务器时,通过后台进程autoprewarm master将预热数据文件autoprewarm.blocks重新加载到内存中。通过使用ps命令可以看到该进程的信息,如下所示:

[postgres@mydb pgsql]$ ps -ef|grep postgres:
postgres 107174 107172  ...  postgres: checkpointer 
postgres 107175 107172  ...  postgres: background writer 
postgres 107176 107172  ...  postgres: walwriter 
postgres 107177 107172  ...  postgres: autovacuum launcher 
postgres 107178 107172  ...  postgres: archiver 
postgres 107179 107172  ...  postgres: stats collector 
postgres 107180 107172  ...  postgres: autoprewarm master 
postgres 107181 107172  ...  postgres: logical replication launcher 
postgres 107186 107172  ...  postgres: postgres postgres [local] idle
相关文章
|
1天前
|
人工智能 数据可视化 网络安全
阿里云/本地一键部署OpenClaw(Clawdbot)教程
OpenClaw(原Clawdbot)作为轻量级AI自动化代理工具,2026年版本在部署灵活性上实现重大升级,既支持本地私有化部署(满足数据隐私、内网使用需求),也适配阿里云一键部署方案(兼顾便捷性与云端稳定性)。本文将完整拆解两种部署方式的核心流程,从环境准备、安装配置到功能验证,包含实操代码命令与避坑技巧,无论你是需要本地私有化部署的企业用户,还是追求零门槛的个人用户,都能快速完成OpenClaw的落地使用。
97 1
|
20小时前
|
人工智能 BI 持续交付
Claude Code 深度适配 DeepSeek V4-Pro 实测:全场景通关与真实体验报告
在 AI 编程工具日趋主流的今天,Claude Code 凭借强大的任务执行、工具调用与工程化能力,成为开发者与自动化运维的核心效率工具。但随着原生模型账号稳定性问题频发,寻找一套兼容、稳定、能力在线的替代方案变得尤为重要。DeepSeek V4-Pro 作为新一代高性能大模型,提供了完整兼容 Claude 协议的 API 接口,只需简单配置即可无缝驱动 Claude Code,且在任务执行、工具调用、复杂流程处理上表现极为稳定。
211 0
|
26天前
|
关系型数据库 MySQL Java
【赵渝强老师】MySQL数据库的分库与分表
Mycat是一款开源分布式数据库中间件,支持MySQL等主流数据库,提供分库分表、读写分离、逻辑库/表抽象等功能。本文详解其核心概念(如分片表、ER表、全局序列号)、安装部署(JDK配置、服务启停)及实战配置(schema.xml/rule.xml),并演示基于三节点MySQL的分片数据路由与查询。
192 31
|
5月前
|
存储 关系型数据库 数据库
【赵渝强老师】PostgreSQL锁的类型
PostgreSQL通过表级锁和行级锁实现并发控制,结合MVCC机制保障数据一致性。锁模式多样,粒度精细,可有效避免事务冲突,提升并发性能。
316 0
【赵渝强老师】PostgreSQL锁的类型
|
7月前
|
Oracle 关系型数据库 Linux
【赵渝强老师】使用NetManager创建Oracle数据库的监听器
Oracle NetManager是数据库网络配置工具,用于创建监听器、配置服务命名与网络连接,支持多数据库共享监听,确保客户端与服务器通信顺畅。
371 0
|
4月前
|
SQL 存储 分布式计算
【赵渝强老师】基于Hudi的大数据湖仓一体架构
Apache Hudi(Hadoop Upserts Delete and Incremental)是开源的流式数据湖平台,支持事务、高效upsert/delete、增量处理、多引擎SQL读写(Spark/Flink/Trino等),自动管理小文件与压缩,兼容云存储,助力构建湖仓一体架构。
672 3
|
9月前
|
分布式计算 Hadoop 测试技术
【赵渝强老师】Hadoop HDFS的快照
Hadoop HDFS快照是文件系统或目录在某一时刻的镜像,提供备份机制,适用于防止错误操作、备份数据、测试环境搭建及灾难恢复等场景。通过管理员命令可开启目录快照功能,并使用操作命令创建、删除、重命名快照。文章演示了具体操作步骤,包括创建两个快照并进行对比,展示了如何通过命令行和Web Console查看快照信息。
271 2
|
6月前
|
数据采集 运维 DataWorks
【赵渝强老师】阿里云大数据集成开发平台DataWorks
DataWorks是阿里云一站式大数据开发治理平台,支持数据集成、开发、建模、分析、质量监控、服务化及迁移等全链路功能,兼容多种计算引擎,助力企业高效构建数据中台,实现数据资产化与价值挖掘。
495 6
|
6月前
|
NoSQL 测试技术 Redis
【赵渝强老师】Redis数据的迁移
Redis提供move、dump+restore和migrate三种方式实现数据迁移。move用于库内迁移,dump+restore跨实例传输,migrate则原子性地完成键的迁移与删除,支持多键批量操作,提升效率。
321 5
|
7月前
|
数据采集 缓存 大数据
【赵渝强老师】大数据日志采集引擎Flume
Apache Flume 是一个分布式、可靠的数据采集系统,支持从多种数据源收集日志信息,并传输至指定目的地。其核心架构由Source、Channel、Sink三组件构成,通过Event封装数据,保障高效与可靠传输。
421 1