PG19 的 GRAPH_TABLE 只是改写器,定长遍历零开销
Alexander Ioffe 实测 PostgreSQL 19 的 SQL/PGQ:GRAPH_TABLE 不是图存储引擎,而是把属性图元数据改写成关系连接。跳数固定的模式与手写连接编译出一样的计划,四跳类型链在 60 万到 240 万行上都在 0.29 毫秒内完成。变长量词则被 beta 直接拒绝,可达性查询只能退回递归 CTE,用时 59 至 2189 毫秒,Apache AGE 还要慢 1.4 至 2.1 倍。
pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
当天收录 32 条。
Alexander Ioffe 实测 PostgreSQL 19 的 SQL/PGQ:GRAPH_TABLE 不是图存储引擎,而是把属性图元数据改写成关系连接。跳数固定的模式与手写连接编译出一样的计划,四跳类型链在 60 万到 240 万行上都在 0.29 毫秒内完成。变长量词则被 beta 直接拒绝,可达性查询只能退回递归 CTE,用时 59 至 2189 毫秒,Apache AGE 还要慢 1.4 至 2.1 倍。
Christophe Pettus 解释 max_locks_per_transaction 与快速路径的关系:17 及更早版本的快速路径固定 16 槽,一条查询要拿的关系锁超过这个数就会溢出到共享锁表,几百个后端同时撞上 LWLock:LockManager 等待。18 起快速路径按参数以 16 为单位分组,默认 64。出路有三条:用预备语句只锁真正用到的索引、升到 18、删掉热表上零使用的索引。
Ashutosh Bapat 为免重启调整缓冲池大小的补丁系列加了成套压力测试,覆盖调整与 CHECKPOINT、pg_prewarm、pg_buffercache 之间的同步。测试暴露出多个缺陷:BufferSync() 需要修正、缓冲区扫描循环里的 CFI 调用位置要挪、pg_prewarm 误以为 NBuffers 恒定。Palak Chaturvedi 的增量修复改成逐个缓冲区处理,非 NUMA 路径快约 25%。
行过滤器可能把 UPDATE 转成 INSERT,于是不属于 replica identity 的未修改 toasted 列值被静默丢掉。社区在 DDL、UPDATE、解码和应用四个时机之间权衡修法,目前倾向:回归分支采用应用端报错,可用 ALTER SUBSCRIPTION SKIP 恢复,master 再加一层按行的检查。Matthias van de Meent 反对把逻辑复制的限制转嫁给普通 DML 用户。
Surya Poondla 审查 WAL 记录压缩补丁时发现违反 WAL-before-data 规则的问题:补丁为纯提示位变更写紧凑记录时没有更新页面 LSN,而 FlushBuffer() 完全靠页面 LSN 保证顺序,跳过 PageSetLSN() 会让 XLogFlush() 变成空操作,页面可能先于对应的 WAL 记录落盘。一旦崩溃,页面上已有的提示位无法通过 WAL 恢复。
Alexander Ioffe 在 200 万行订单表上比较了无二级索引、单列索引和带 INCLUDE 的覆盖索引。覆盖索引会让被包含列的更新失去 HOT 优化,插入比单列索引慢 28%、比无索引慢 88%,更新分别慢约 25% 和 30%,占用 112 MB 而单列索引只要 18 MB,换来的是读取快 1.26 倍。他的结论是:只有当每个分析查询对应的写入低于每分钟约 4300 次时,覆盖索引才划算。
jit_above_cost 默认 100000 触发编译,jit_inline_above_cost 与 jit_optimize_above_cost 默认 500000,分别再加内联和 LLVM 优化。Christophe Pettus 指出根本矛盾:计划代价衡量的是取页数和行数,JIT 的收益却取决于表达式执行多少次、有多复杂,分区扫描加 sum(id) 会白白编译。他建议 OLTP 库直接关掉 JIT。
Gabriele Bartolini 演示把 Linux 基金会的 Vault 分支 OpenBao 部署在 Kubernetes 上,用三副本 CNPG 集群作 postgresql 存储驱动的后端:客户端证书由 DatabaseRole 签发,配合 pg_hba.conf 实现免密码双向 TLS,openbao-rw 角色只对两张表有读写权限。要注意 OpenBao 只在启动时打开连接池,证书 90 天轮换后必须滚动重启 Pod。
PoWA 团队发布核心扩展 powa-archivist 5.3.0。PoWA 是 PostgreSQL 负载分析工具,通过一组覆盖各子系统的扩展从多个实例采集并聚合指标,提供实时图表,还能给出全局或按查询的索引建议。这一版只有一处改动:适配 pg19beta2 中 pg_stat_lock.wait_time 的数据类型变更,修复由 Julien Rouhaud 提交。已在跟 19 beta 做兼容性验证的用户需要同步升级。
Daniel Gustafsson 合入补丁并补上文档,测试用 PG_TEST_EXTRA 门控;PG19 先保持简单实现。
统计更新写在 checksum_failures > 1 的条件里,单页损坏被静默忽略,缺陷自 6b9e875f728 就存在。
v6 收到状态交接与字段所有权的质疑,建议让 startup 独占策略,producer 退化为纯 WAL 读取器。
hex_decode_safe() 会静默跳过空白,解码结果不足 16 字节时回退标量解析;strlen() 也改成 strnlen()。
尺寸计算全面改用 Size 与 add_size()/mul_size(),Michael Paquier 认为不必回移到旧分支。
Tomas Vondra 解释 CustomScan 钩子补丁为何搁置:夏季本就是稳定期,今年又涌入大量 AI 生成的报告。
开发者不必再分别管理各家模型账号,可以像用文件存储和身份验证那样在 Neon 内部调用模型。
协议兼容只是起点,作者指出有一个核心概念决定了这些 PostgreSQL CDC 工具能否真正跑通。