PG 19 异步IO再进化: BRIN索引vacuum工作流支持流式异步IO
本期播客
PostgreSQL 19 preview - 异步IO继续深化革新PG方方面面, BRIN索引vacuum工作流支持流式异步IO
PG的尿性: 当引入一款革命性功能时, 先进行顶层设计, 然后实现基础设施接口, 最后逐步深化到各个模块.
AIO 异步接口也是这样, 看我写文章的时间线也能了解一二:
1、首先是为异步IO做准备, 提交的若干功能
《PostgreSQL 18 preview - read_stream 启发式预读量优化, 异步IO准备》 《PostgreSQL 18 preview - 打开文件数限制max_files_per_process更新, 为异步IO io_uring做准备》 《PostgreSQL 18 preview - 异步IO支持io_uring, IO性能大幅提升》
2、然后是重磅推出AIO框架
《PostgreSQL 18 preview - 重磅, 刚刚支持异步IO框架》 《PostgreSQL 18 AIO & DIO 顶层设计》
3、开始应用到PG各个功能模块, 例如性能提升最明显的重度IO场景 垃圾回收、分析型SQL 等
《PostgreSQL 18 preview - 异步IO(AIO)应用到缓冲区管理器层面》 《PostgreSQL 18 preview - bitmap Heap Scan支持AIO批量读》 《又涨知识了, 向量搜索异步IO优化》
4、然后是持续的优化, 性能分析增强等
《PostgreSQL 18 preview - AIO增强 : 增加监控工具、增强测试能力、清理代码、改进错误诊断》 《PostgreSQL 19 preview - 合理合并 AIO io_uring 的内存映射》 《PG 18 AIO 性能改进详细评测》
5、AIO逐步深化后, 已经有用户在畅想, 未来肯定还会支持DIO
《AIO 是PostgreSQL的终点吗? 不, 未来将大力发展DIO》
好, 前言有点多, 今天这篇说的还是将AIO应用到PG各个功能模块的patch, BRIN索引vacuum工作流支持流式异步IO
https://github.com/postgres/postgres/commit/a6eac2273e6e762003e763f45b880261fbd473a4
补丁解读
这个补丁的核心目的是提升 PostgreSQL 中 BRIN 索引的清理(VACUUM)操作的性能和效率。
简单来说,就是让数据库在清理这种特殊的索引时,读取数据块的方式更聪明、更快了。
1. 涉及到哪里?(背景知识)
BRIN 索引(Block Range INdexes): 这是一种特殊的 PostgreSQL 索引,它不为每一行数据建立索引,而是为一大段数据(一个数据块范围)建立一个摘要信息。它的特点是体积小,常用于数据按某种顺序(如时间)排列的大表。 VACUUM 扫描: 这是数据库的维护工作,会定期清理表和索引中不再需要的旧数据(例如被删除的数据)。在清理 BRIN 索引时,需要扫描索引的每一个页面。
2. 补丁做了什么?(核心改进)
这个补丁将 BRIN 索引的 VACUUM 扫描,从传统的“点对点”读取方式,改成了使用 “流式读取 I/O”(streaming read I/O) 。
| 普通的循环读取: | 流式读取 I/O:ReadStream),它能预测接下来需要哪些数据块,并提前把它们载入内存(这叫“预读”)。 |
3. 这样做的好处是什么?
速度提升: 就像使用一条顺畅的“水流”而不是一个一个“水滴”来传输数据,连续且预先准备好的读取操作大大减少了磁盘等待时间,提高了数据块加载的效率。 减少开销: 尽管 BRIN 索引本身很小,但这种优化后的读取策略对于任何顺序读取操作都有益处。提交信息提到,性能测试已经显示有实际的性能改进。
总结: 这个补丁让 PostgreSQL 在清理 BRIN 索引时,能更聪明、更流畅地从磁盘读取数据,从而让数据库的维护工作(VACUUM)更快地完成。