暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

数据库开源动态简讯 · 2026-08-26

digoal德哥 2026-08-27
276

过去 48 小时,开源世界发生了这些事:

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

6 源近 48h 动态分布

128 条动态按角色分布

简讯

每条 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 in pg_restore_relation_stats()
     — pg_restore_relation_stats()
     的整数符号处理 bug,可能导致恢复 stats 失败或数值越界。
  • [DBA, 应用开发者]
    Change InputFunctionCall*
     to take a const 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 of pg_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 folding MAX_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 for length()
    /char_length()
     filters via code-point lower bound (#24999)
     — 长度谓词剪枝。
  • [架构师]
    Optimize StringUtil::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 combining index=none
     and secure-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
    , and log_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% 以下。


AsOf Join + Hive 分区

痛点

之前要解决这个,通常得上 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/电商/金融场景频繁发生。

过去三种解法都有明显缺陷:

  1. synchronous_commit = remote_apply
     — 每个 commit 都阻塞等从库,延迟成倍。
  2. 应用侧轮询 pg_last_wal_replay_lsn()
     — 每个应用都得自己实现一遍。
  3. 不读从库 — 失去横向扩展收益。

原理

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 和崩溃溯源麻烦。

结语

今日三个深度信号:

  1. DuckDB 仍在加速向"嵌入式数据湖引擎"演进 — AsOf + Hive 是组合拳,Java Table Function 是 JVM 生态入口。这两条线汇合,DuckDB 已经可以挑战很多轻量级分布式场景。
  2. PG 19 把"复制延迟"问题从应用层上移到 SQL 层 — WAIT FOR
     是 6 年来 PG 复制语义最大的一次渐进式改进。
  3. 生态节点密度见顶 — 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

最后修改时间:2026-08-27 09:56:19
文章转载自digoal德哥,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论