过去 48 小时,开源世界发生了这些事:
DuckDB 合并 PR #25016:AsOf Join 终于支持 Hive 分区剪枝 — 时序/IoT/金融 tick 数据场景下,扫描量降到原来的 20% 以下。 PostgreSQL 19 新语法 WAIT FOR
详解出炉:ClickHouse 团队发文拆解,核心价值是"读己写"一致性不再付出同步复制代价。DuckDB Java 驱动支持纯 Java 写 Table Function:不再需要 C++ 工具链,JVM 生态可以直接挂自定义数据源。 DuckDB 修了一个会吐错结果的常量折叠 bug:当 SQL 包含 MAX_INT
常量时,结果可能完全错误 — 已经合并修复。PostgreSQL 把 stringToNode()
改成线程安全:为并行逻辑扫除障碍,影响 PG 17+ 后续优化路径。SQLite 推进 UNION + LIMIT 1
优化 + 大批 OOM 容错:fs5 全文索引多处死角被补。DuckDB Community Extensions 大版本井喷:quackiso 1.7.0、luajit v0.32.2、webbed 2.7.0、oracle_scanner 0.2.0 等十余个更新。


简讯
每条 commit article 后用
[DBA]
/[架构师]
/[应用开发者]
标注最相关的角色。一个条目可能同时影响多角色。
PostgreSQL master
最近 48h 抓到 29 个 commit,主要是稳定性修复 + 并行/线程安全重构。
[架构师]
Make stringToNode() infrastructure thread-safe — 把stringToNode()
改成线程安全。这是后续并行路径(如并行 logical apply worker、并行 backup)的基础设施,值得 DBA 关注。[DBA, 架构师]
Fix autovacuum's handling of TOAST storage parameters +Fix VACUUM's handling of TOAST storage parameters
— 两个一起提交,修的是同一个根因:autovacuum 进程在重写 TOAST 表时,会丢失用户配置的 storage parameter(如TOAST_TUPLE_TARGET
)。这意味着运维在表上精心调过的 toast 参数会被静默回退到默认值。[DBA]
Fix crash on trying to expand a shared memory hash table — 共享内存哈希表扩容时的崩溃,DBA 必看。[DBA]
Fix CPU cost of right-semi and right-anti hash joins — 哈希连接在某些 right-semi right-anti 场景 CPU cost 估算偏差导致规划器选错,会导致慢查询。[DBA]
Fix signed/unsigned integer handling inpg_restore_relation_stats()
—pg_restore_relation_stats()
的整数符号处理 bug,可能导致恢复 stats 失败或数值越界。[DBA, 应用开发者]Change InputFunctionCall*
to take aconst char *str
— 类型输入函数签名改 const,影响 extension 开发者。[架构师]
postgres_fdw: Further cleanup related to statistics import support — postgres_fdw 远端统计信息导入持续打磨。[DBA, 架构师, 应用开发者]
postgres_fdw: Fix flaky push down FUNCTION RTE test — 修测试用例的 flaky,确保远端 FUNCTION push-down 行为稳定。[架构师]
Don't assume DISTINCT ON implies uniqueness when the tlist has SRFs — 优化器相关,涉及 set-returning function 的 DISTINCT ON 推导逻辑修正。[DBA, 应用开发者]
Fix some -Wcast-qual warnings Fix accidentally casting away const Fix incorrect cast in Assert — 一组编译警告清理,降低未来隐藏 bug 风险。[应用开发者]
doc: Update REPACK-related table rewrite documentation — REPACK 文档更新(操作相关)。[架构师]
doc: Document overflow handling ofpg_class.relpages
— 元数据溢出文档补充。
DuckDB main
最近 48h 抓到 30 个 commit,其中两个关键 PR 在 8/25 ~ 8/26 之间合入:
[DBA]
Internal #10417: AsOf Hive Partitioning (#25016) — 重大特性。AsOf Join 现在能利用 Hive 分区剪枝。详见 深度讲解 1。[DBA]
Fix wrong results when constant foldingMAX_INT
(#24998) — 数据正确性 bug。常量折叠优化在MAX_INT
边界会算错,可能让含SELECT MAX_INT/2
、SELECT 2147483647+1
的查询吐错结果。务必升级到含此 commit 的 nightly。[DBA, 应用开发者][JSON] Fix DECIMAL value roundtrip bug that was caused by lossy json_read behavior
— JSON roundtrip 在 DECIMAL 上有精度损失,影响任何用 DuckDB 读 JSON 数据的金融/财务场景。[应用开发者]
Raise an error on integer division by zero instead of returning NULL (#25004) — 行为变更。原来整数除 0 返回 NULL,现在抛错。SQL 标准行为。注意如果你的应用依赖旧行为会断。[DBA][Dev][Parser] Fix MatchParseResult
regression (#25007) — 解析器回归修复。[架构师]
Correctly handle nested schemas in remote pushdown optimizer (#25009) + 多个相关 commit — 远端 pushdown 优化器在嵌套 schema 上的正确性。[架构师]
Allow extension to register custom compression filesystem (#24968) — 扩展可注册自定义压缩文件系统,为 Parquet/Zstd 之外的压缩算法开路。[架构师, 应用开发者]
Try-march x86-64-v3
for CLI and v2 for extensions (#24391) — 编译优化升级,CLI 启用 AVX2 扩展用 AVX。性能提升。[应用开发者]
Use unchecked casts for proven integer ranges (#24916) — 优化器在证明整数范围后用 unchecked cast,运行更快。[DBA]
Fix COPY FROM with statement triggers (#23896) — COPY 触发器行为修正。[架构师]
Implement date time row group pruning (#24943) — datetime 谓词触发 row group 剪枝,Parquet 查询加速。[架构师]
Prune row group for string contains on equal strings (#24940) — 字符串谓词剪枝。[架构师]
Prune row groups forlength()
/char_length()
filters via code-point lower bound (#24999) — 长度谓词剪枝。[架构师]
OptimizeStringUtil::Replace
(#24990) — 内部字符串替换函数优化。
DuckDB Community Extensions
30 个 commit,生态健康,生态节点密集。
[架构师]
quackiso 1.7.0:wire formats MT101 和 MT104 的双协议审计。[架构师]
luajit v0.32.2:DuckDB Lua JIT 扩展升级。[架构师]
webbed 2.7.0:Webbed (HTTP/Web 资源访问) 升级。[架构师]
oracle_scanner 0.2.0:Oracle 数据扫描器 bump。[架构师]
Update substrait extension to 1.5.5:对齐主版本 DuckDB。[应用开发者]
Add duckdb_rphonetic extension:新增 R Phonetic 模糊匹配扩展。[DBA, 应用开发者]
Update file_dialog for DuckDB v1.5.5:文件对话框扩展兼容性更新。[架构师]
Pin v0.1.0 (b74284d) +Declare requires_toolchains and excluded_platforms
:扩展可声明工具链要求和排除平台,扩展生态正式引入分发控制。
SQLite master
26 个 commit,以 OOM 容错 + fts5 死角为主。
[架构师]
New optimizations for improved performance of UNION with LIMIT 1 +Make the optimization of UNION with ORDER BY and LIMIT sound by restricting
— UNION+LIMIT 1 优化器改造,正确性 + 性能双修。[DBA, 应用开发者]Avoid coding WHERE constraints too early when using the OR-optimization with OUTER join queries
— OR 优化与 OUTER JOIN 交互时,WHERE 子句下推时机不当的 bug。[DBA, 应用开发者]
Fix a problem with combiningindex=none
andsecure-delete
modes causing full-text index entries to be recoverable — 安全/隐私 问题。index=none
+secure-delete
组合下,fts5 索引可能没真删干净,可被恢复。[架构师]
Improved handling of OOM conditions in the sessions extension Windows implementation QRF sublibrary expert.c — 多个扩展模块 OOM 容错,稳定性提升。[架构师]
Prevent some potential NULL pointer dereferences following misuse of the — 多个 NULL deref 防护。[DBA]
Prohibit using ALTER TABLE to add or drop, or rename to or from a rowid alias — ALTER TABLE 在 rowid 别名上的限制收紧,数据完整性。[DBA]
Avoid a technically undefined signed integer overflow in fts5 — fts5 整数溢出 UB 修复。[DBA]
Fix some fts5 cases where all columns are excluded by a column filter — fts5 列过滤死角。[架构师]
Ensure that the fts5_vocab.term column behaves as if it has blob affinity for comparisons — fts5 vocab 表的 affinity 行为修正。[DBA]Ensure that when a large integer value (too large to be losslessly converted to double)
— 大整数转 double 的精度保护。
PostgreSQL Planet
12 篇文章,大多是 PG 19 相关 + GUC 调优系列。
[DBA]
Christophe Pettus — All Your GUCs in a Row:log_connections
,log_disconnections
, andlog_ho...
— 审计/日志 GUC 系列连载。[DBA]
Christophe Pettus — All Your GUCs in a Row:log_checkpoints
,log_autovacuum_min_duration
— 同系列,checkpoint autovacuum 日志 GUC。[架构师]
Christophe Pettus — All Your GUCs in a Row:listen_addresses
— 同系列,网络 GUC。[应用开发者]
Gülçin Yıldırım Jelínek — Read your writes: WAIT FOR in PostgreSQL 19 — PG 19 重磅新语法解读。详见 深度讲解 2。[应用开发者]
Hubert 'depesz' Lubaczewski — New things for regular expressions in PostgreSQL (pg_tr
and ...) — 正则/全文检索新功能综述。[应用开发者]
Vibhor Kumar — Your PostgreSQL Platform Has Telemetry. Does It Have a Digital Twin? — 平台遥测/数字孪生议题。[应用开发者]
Alexey Evlampiev — Scenario-Tree Testing in PostgreSQL: Every Authored Branch, Shared Histo... — 测试方法学。[架构师]
Henrietta Dombrovskaya — How to optimize when you can't do anything! — 性能优化实务。[架构师]
Cornelia Biacsics — Contributions for week 33 — 社区贡献周报。[应用开发者]
cary huang — PostgreSQL in Taipei: Connecting Taiwan to the Global PostgreSQL Community — 社区动态。[架构师]
Christophe Pettus — The Sixth Execution — 深度长文。[架构师]
Regina Obe — PostGIS 3.7.0rc1 — PostGIS 3.7 RC1 发布。
DuckDB News
[应用开发者]
DuckDB Table Functions in Java — Java 驱动支持纯 Java Table Function。详见 深度讲解 3。
深度讲解
深度讲解 1: DuckDB AsOf Join + Hive 分区剪枝 — 时序/数据湖场景的终极组合
背景
DuckDB 1.0 起就有 AsOf Join — 把"在某个时间点最近的匹配"这件事用 SQL 表达,金融 tick 数据、IoT 传感器、订单簿场景的天命语法:
SELECT *
FROM orders
ASOF JOIN quotes
ON orders.symbol = quotes.symbol
AND quotes.ts <= orders.ts;
但当数据存成 Hive 风格分区(比如 s3://lake/dt=2026-08-25/symbol=AAPL/*.parquet
),AsOf Join 不识别分区,会把整个目录全扫一遍。1000 个分区就是 1000 个 full scan。
原理
PR #25016 把 Hive 分区元数据(dt=...
、region=...
、symbol=...
)作为虚拟列推入查询优化器。当 SQL 含分区列谓词时,直接 skip 不相关分区的 parquet 文件;AsOf Join 在剩下的分区内继续走时序匹配逻辑。两层优化叠加,扫描量常常降到 20% 以下。

痛点
之前要解决这个,通常得上 ClickHouse TimescaleDB 这类专门的时序库,或者自己写 partition pruning 逻辑。DuckDB 把这两件事塞进一个内嵌引擎,极大降低架构复杂度。
价值
DBA:少接一个新组件,运维面更小。 架构师:数据湖 → 实时分析的栈更薄; SELECT ... FROM read_parquet('s3://lake/dt=*')
+ASOF JOIN
就能出报表。应用开发者:纯 SQL,不需要引入额外 SDK 或 ORM 抽象。
深度讲解 2: PostgreSQL 19 的 WAIT FOR
— 读己写一致性终于有了 SQL 级别解法
背景
异步复制架构下有个老问题:写主库、读从库。主库 commit 后,从库可能落后几毫秒到几秒。如果应用写完订单立即读,会读不到。这种"读己写"(read-your-writes)违反在 SaaS/电商/金融场景频繁发生。
过去三种解法都有明显缺陷:
synchronous_commit = remote_apply
— 每个 commit 都阻塞等从库,延迟成倍。应用侧轮询 pg_last_wal_replay_lsn()
— 每个应用都得自己实现一遍。不读从库 — 失去横向扩展收益。
原理
PG 19 新增 WAIT FOR LSN '...' [WITH (...)]
。机制:主库 commit 后,应用拿到 pg_current_wal_insert_lsn()
(含 synchronous_commit=off
的 WAL);session 在从库上跑 WAIT FOR
后,从库会阻塞直到 startup process 重放 WAL 到达该 LSN,然后会话解除阻塞再执行读。
-- 主库
UPDATE orders SET status = 'paid' WHERE id = 42;
SELECT pg_current_wal_insert_lsn(); -- 拿到 LSN,传给读端
-- 从库
BEGIN;
WAIT FOR LSN '0/306EE20';
SELECT * FROM orders WHERE id = 42; -- 保证读到刚才的更新
COMMIT;
支持 MODE
: standby_replay
(默认)/ standby_write
/ standby_flush
/ primary_flush
。TIMEOUT
可设上限,NO_THROW
超时不抛错。
痛点
传统做法要么牺牲写入延迟,要么让应用写重复代码。WAIT FOR
把"读己写"提到 SQL 协议层,跨库迁移友好。
价值
DBA:从库终于能做真正的一致性读了,延迟敏感型业务可以分流。 架构师:读写分离架构的实现成本骤降,系统设计可以更直接。 应用开发者:不用再在应用层实现 LSN 轮询;SQL 表达即可。
注意:这是 PG 19 beta,正式发布前细节可能变。详见 原文。
深度讲解 3: DuckDB Java Table Functions — JVM 数据源接入彻底告别 C++ 扩展
背景
企业内数据散落在几十个系统里:关系库、文档库、消息队列、数据湖、专有 SaaS API。很多数据源只能通过 vendor SDK 访问,且几乎都是 Java / JVM 生态。想把这些源 join 到 DuckDB 查询里,过去必须写 C++ 扩展:配置 CMake、装 toolchain、处理平台相关崩溃、segfault 风险。
原理
DuckDB v1.5.5+ 的 Java 客户端支持纯 Java 写 Table Function。任何 Java 可访问的数据源(自家 SDK、MongoDB driver、SOAP endpoint、消息队列客户端)都能注册成 SQL 表函数,然后在 DuckDB 里和本地 Parquet / CSV 一起 join:
connection.registerTableFunction("mongo_query",
new MongoQueryTableFunction(mongoClient));
SELECT o.id, m.payload
FROM orders o
JOIN mongo_query('orders', '{}') m ON o.id = m.doc_id;
痛点
不用建 C++ 扩展 → 没有 native crash 风险,segfault 不再能拖垮 JVM。 任何 JVM 语言都能写(Kotlin / Scala / Clojure / Java)。 Maven 依赖就能分发,运维门槛降到零。
价值
架构师:DuckDB 在 JVM 数据中心成为"单节点查询引擎",可以替代部分 Trino 用例。 应用开发者:用熟悉的 Java 写,不必碰 C++ build system。 DBA:少一个 C++ 扩展 = 少一类平台兼容性 bug 和崩溃溯源麻烦。
结语
今日三个深度信号:
DuckDB 仍在加速向"嵌入式数据湖引擎"演进 — AsOf + Hive 是组合拳,Java Table Function 是 JVM 生态入口。这两条线汇合,DuckDB 已经可以挑战很多轻量级分布式场景。 PG 19 把"复制延迟"问题从应用层上移到 SQL 层 — WAIT FOR
是 6 年来 PG 复制语义最大的一次渐进式改进。生态节点密度见顶 — DuckDB Community Extensions 一周十几个版本,这是健康生态的标志,也是 extension 作者维护负担的预警。
行动建议:
用 DuckDB 做时序/数据湖 demo 的同学,本周就可以拉 nightly 试 #25016 + JSON DECIMAL 修复。 升 PG 17/18 的 DBA,关注 stringToNode()
线程安全这条线对应的下一个并行 worker PR。关注 WAIT FOR
文档(https://www.postgresql.org/docs/19/sql-wait-for.html),把它写进你下一个 SaaS 架构评审 checklist




