PostgreSQL 技术日报 (3月26日)|架构选择与执行性能的再平衡

🔔 关注【IvorySQL开源数据库社区】公众号即可获取 PostgreSQL 一手干货与最新动态

pg每日新闻封面.png

⚙️ PostgreSQL技术文章

🧩 六边形网格、超级表与240个废弃标签:海事数据平台迁移至 TimescaleDB

1.png

VesselAPI将其海事AIS追踪平台从MongoDB迁移到TimescaleDB,每小时处理70万条船舶位置报告。这次迁移解决了MongoDB在时序数据和空间查询方面的局限性。TimescaleDB的hypertable抽象自动将数据分区为1小时的chunks,实现高效的数据保留策略和压缩。他们实施了H3六边形空间索引作为PostGIS查询的预过滤器,将候选行数从数百万大幅减少到数千行。由于H3INDEX列类型不支持COPY协议,系统使用PostgreSQL的SendBatch进行高吞吐量插入。一个关键bug源于遗留的BSON结构体标签与JSON序列化冲突,导致240个损坏的标签和端口数据为空,直到修复后才解决。整个系统现在在单台EC2 r7i.large实例上高效运行。

https://www.tigerdata.com/blog/hexagons-hypertables-240-dead-tags-migrating-maritime-data-platform-timescaledb

📨 PostgreSQL Hacker 电子邮件讨论精选

🧩 REPACK [concurrently] 的使用方式

讨论围绕在PostgreSQL中实现REPACK CONCURRENTLY功能展开。Antonin Houska研究了在表复制过程中处理已删除列的tuple slot优化问题,质疑使用slot是否比当前的显式重组方法更能提升性能。他建议了一些优化方案,如仅在存在已删除列时才进行重组,以及更早移除已删除的值。Srinath Reddy发现了一个错误处理问题:当在事务块内运行REPACK CONCURRENTLY且未指定表名时,会显示误导性的错误消息,他提出修复方案以保持与VACUUM和REINDEX等其他命令的一致性。在表交换操作的锁升级行为方面出现了重要问题——当冲突锁导致超时或取消时,清理过程会移除相关文件,从而造成临时表数据丢失。Alvaro Herrera建议修改死锁检测器,通过终止其他冲突进程来优先处理REPACK操作,他认为在并发重组期间不应进行有意义的表操作。

https://pgnexus.ai/hacker-discussions?subject=Adding REPACK [concurrently]

🧩 🧩 pg_waldump:支持从 tar 文件中解码 WAL

Tom Lane 发现并修复了 pg_waldump tarfile 解码功能的两个关键问题。首先,他解决了文件描述符泄漏问题,该问题导致 Windows 上无法正确清理临时目录。其次,他发现 archive_waldump.c 中的代码没有意识到 simplehash.h 表操作可能会移动条目,从而破坏 privateInfo->cur_file 和 read_archive_wal_page 功能。Lane 提供了补丁(v8-0001 和 v8-0002)来解决这两个问题。他指出当前的 TAP 测试使用的数据不足以可靠地触发这些问题,表明测试覆盖率不够。此外,他建议移除 read_archive_wal_page 中的缓冲区截断优化,认为这会增加代码复杂性并存在潜在的损坏风险。Andres Freund 确认了 fairywren 等机器上的多次 buildfarm 失败和频繁的 CI 失败,表明这些问题分布广泛且可能正在恶化。

https://www.postgresql.org/message-id/374225.1774459521@sss.pgh.pa.us

🧩 Buffer 锁定的特殊性(提示、校验和、异步 I/O 写入)

Andres Freund 已推送了缓冲区锁定优化系列中的多个补丁,并分享了剩余更改的更新版本。Melanie Plageman 审查了三个剩余补丁(0001-0003),提供了详细反馈。对于补丁 0001,她发现 PageSetChecksum() 注释错误地声明仅适用于共享缓冲区,以及对已删除的 bufToWrite 变量的残留引用。对于补丁 0002(通过在需要相同块时避免不必要的缓冲区操作来优化 _bt_relandgetbuf()),她质疑为什么要进行解锁和重新锁定而不是直接检查锁定模式。对于补丁 0003,她注意到缺少 VALGRIND_MAKE_MEM_NOACCESS 调用和注释中的语法错误。Andres 回应修复了这些问题,更新了 PageSetChecksum() 注释以澄清它适用于需要共享排他锁定的共享缓冲区,并解决了 valgrind 和语法问题。他正在运行最终的 valgrind 测试,然后推送剩余补丁。

https://www.postgresql.org/message-id/CAAKRu_Z=xrBWhAB5wRG8x-gnjNa7ZnW-sSsEbBfR1C8gwuTD8g@mail.gmail.com

🧩 将 JIT 的默认值改为关闭

PostgreSQL 社区正在讨论将版本19中JIT(即时编译)的默认设置改为关闭。Tom Lane等人支持这一决定,已形成明确共识。Pierre Ducroquet提出了替代方案:保持JIT启用但将jit_tuple_deforming默认设为关闭,认为这样既能消除大多数问题查询,又能为最佳用例保留性能优势。然而,Andres Freund和Tomas Vondra对此表示怀疑,他们指出表达式编译通常主导JIT成本,而非元组解析。Vondra引用了具体的性能案例,显示优化阶段消耗了JIT的大部分时间。讨论的焦点在于部分禁用JIT是否足够,还是需要在PostgreSQL 19中完全禁用默认设置。

https://www.postgresql.org/message-id/d8bb1295-6392-4cba-917d-de7da2b8c8bd@vondra.me

🧩 generic 计划与"初始"分区裁剪

Amit Langote 提交了第8版补丁系列,通过为分区表实现感知分区裁剪的锁定机制来优化通用计划。当前系统在 GetCachedPlan() 中预先锁定所有分区,即使 ExecutorStart() 期间的初始分区裁剪会消除其中许多分区。提议的解决方案引入 ExecutorPrep() 来执行早期执行器设置(包括分区裁剪),使 GetCachedPlan() 仅锁定保留的分区。该方法通过可选的 CachedPlanPrepData 参数保持向后兼容性。当提供此参数时,调用方必须确保预处理的 EState 传递到 ExecutorStart(),以避免在未锁定的关系上操作。调试断言验证适当的锁覆盖。补丁包含通过 portal、SPI、EXECUTE、SQL 函数和 EXPLAIN 的全面管道连接。Amit 寻求关于在 GetCachedPlan() 中运行执行器逻辑是否可接受的反馈,指出这跨越了传统的计划缓存/执行器边界,但能够实现必要的优化。

https://www.postgresql.org/message-id/CA+HiwqFx0kmGqSDcLrE37KkHS2T9O1NoBitZT4mA4yJBBt_QjA@mail.gmail.com

🧩 读取流中已在进行的 IO 操作不应该同步等待

Andres Freund 和 Melanie Plageman 正在完善一个 PostgreSQL 补丁,该补丁修改了缓冲区 I/O 操作处理进行中 I/O 的方式。讨论焦点是 Andres 对 StartBufferIO() 的修订,使其接受枚举返回值和 PgAioWaitRef 指针参数,让调用者可以选择同步等待、异步等待或不等待 I/O 完成。Melanie 接受了这种方法,但对 io_wref 参数既作为输入又作为输出的双重用途表示担忧。她要求提供更清晰的文档说明调用者使用不同参数组合的原因。Andres 修复了 Melanie 发现的复制粘贴错误,并改进了函数注释,更好地解释了使用场景。补丁集包含了对 StartReadBuffers() 及相关函数的增强测试覆盖。Andres 计划尽快提交前几个补丁,其余部分将在简短审查后提交。

https://www.postgresql.org/message-id/rk56uxuqxi3udzu5oqc7qft5u7nncau5d2avlbui6obd7ybols@wlu2euvawj7t

🌐 社交媒体动态

🧩 明天上午在阿姆斯特丹KubeCon26 与CYBERTEC面的最后机会

2.jpeg

这是最后一次在阿姆斯特丹 KubeCon26 与 CYBERTEC 见面的机会,定于明天上午。本次活动为与会者提供了与该公司代表交流并了解其产品的机会。感兴趣的人士请勿错过此次会议结束前的最后会面。

https://www.linkedin.com/posts/activity-7442619437628825600-C1pB

🧩 PostgreSQL18新增OAuth2.0身份验证方式

3.jpeg

PostgreSQL 18 引入了 OAuth 2.0 身份验证方式,允许应用程序和用户通过 Google 或 Auth0 等提供商的身份令牌连接数据库服务器,无需使用传统密码。Rafia Sabih 在其最新博客中提供了完整的配置指南。

https://www.linkedin.com/posts/cybertec-postgresql_postgresql-oauth2-postgresql18-activity-7442601454168616960-JDUi

🧩 在更多团队正在探索代理分析以简化数据工作流程

越来越多的团队采用代理分析来优化数据工作流程。本资源由Alex Freberg与Anthropic和Databricks的专家共同探讨代理分析如何改变团队运作。内容涵盖从数据准备到洞察的完整分析流程、Databricks分析工具的新功能、使用Genie和Claude实现AI驱动的洞察,以及无需传统BI工具构建完整分析工作流程的方法。

https://www.linkedin.com/posts/databricks_more-teams-are-exploring-agentic-analytics-activity-7442655185778298880-iKAw

🔥 HOW 2026 报名进行中

一场真正以技术为核心的 PostgreSQL 大会
HOW 2026 PostgreSQL & IvorySQL 技术峰会火热报名中
📍 2026 年 4 月 27 日 - 28 日|济南
早鸟优惠限时开放,扫码即刻锁定席位
报名二维码.png

posted @ 2026-03-26 15:28  IvorySQL  阅读(3)  评论(0)    收藏  举报