ClickHouse 的 pg_clickhouse v0.10 将 TPC-H Q17 的运行时间缩短了 884 倍

该扩展将 PostgreSQL 保留为 SQL 接口,同时将符合条件的分析子查询移至 ClickHouse 执行。

By · Published

Primary source: ClickHouse

Why it matters

ClickHouse is using pg_clickhouse to make its analytical engine adoptable without a wholesale PostgreSQL migration. The 884x Q17 result shows the payoff when pushdown works, while the remaining query gaps define the engineering risk.

Optimized analytical query execution via database extension (Flat modernist vector illustration in the spirit of mid-century corporate annual reports, with bold simple shapes and textured overprint)

ClickHouse engineer Josh Ventura released pg_clickhouse v0.10.0 on August 11, pushing more PostgreSQL subqueries into ClickHouse and cutting one vendor-tested TPC-H query from 32.7 seconds to 37 milliseconds.

该发布推进了 ClickHouse 联合创始人兼 CTO Alexey Milovidov 在 2009 年开始构建的架构目标:随着底层数据增长,保持分析查询的交互性。底层的 ClickHouse 系统在 2012 年进入 Yandex.Metrica 的生产环境,并在 2016 年成为开源项目。联合创始人 Aaron Katz 和 Yury Izrailevsky 随后帮助将该数据库发展成独立业务,pg_clickhouse 则将相同的性能赌注扩展到 PostgreSQL,而不是要求开发者放弃他们应用已在使用的接口。

在一篇 宣布 v0.10.0 的工程帖子 中,Ventura 将此次发布的直接目标描述为在包含 22 个查询的 TPC-H 基准上实现完整的查询下推。该项目已从 12 个完全下推的查询进展到 16 个,仍有六个待解决。

结果比“1000 倍更快”这类简化说法要有限得多。ClickHouse 在 TPC-H Q17(一个在尺度因子 1 下的特定相关子查询工作负载)上测得约 884 倍的提升。上述数字为厂商基准测试,并不能证明在安装该扩展后 PostgreSQL 工作负载通常会变得快数百倍。

但它们展示了执行位置为何重要。

Moving the work instead of the rows

pg_clickhouse 是一个开源的 PostgreSQL 扩展和外部数据包装器。它允许 PostgreSQL 会话查询存放在 ClickHouse 中的表,同时尝试将过滤器、连接、聚合和其他受支持的操作发送到 ClickHouse 进行远程执行。

在 v0.10.0 之前,某些相关子查询仍以本地 PostgreSQL 计划存在。pg_clickhouse 可能最终从 ClickHouse 检索行并对每个外层行在本地评估子查询。这样的设计抹消了将分析数据放入列式数据库的优势,因为该扩展在数据库边界间移动了大量结果集,并在 PostgreSQL 内部重复执行工作。

Ventura 的团队更改了规划器和反解析器,使受支持的 PostgreSQL 子查询在远程 SQL 语句中成为 ClickHouse 子查询。Ventura 简单概括了这一变化:“现在,Postgres 中的子查询会成为 ClickHouse 中的子查询。”

Q17 提供了最清晰的例子。该查询通过对 600 万条行项目进行相关子查询,为每个零件计算平均数量。ClickHouse 报告称 pg_clickhouse v0.3 在该操作本地评估时耗时 32,709 毫秒。将完整查询发送到 ClickHouse 后,v0.10 在 37 毫秒内完成。相同公布测试中,原生 PostgreSQL 耗时 2,107 毫秒。

该项目的当前基准表 表明测试在一台配备 M4 Max 处理器和 36 GB 内存的 MacBook Pro 上使用 TPC-H 尺度因子 1 进行。Q2 在 pg_clickhouse v0.3 中从 3,446 毫秒降至 v0.10 的 24 毫秒。Q22 从 1,415 毫秒降至 45 毫秒,尽管 Q22 仍然使用多个远程扫描而不是单个外部扫描。

这些限定条件很重要。TPC-H 是一个受控的决策支持基准,公布的数字仅覆盖一台机器、一种数据规模和选定的查询计划。ClickHouse 尚未公布 pg_clickhouse 的部署数量、生产客户结果或可归因于该扩展的收入。

Query correctness became the harder problem

将 SQL 发送到另一个数据库引擎会产生第二个义务:远程查询必须返回 PostgreSQL 本来会产生的结果。

Ventura 将发布的一部分工作集中在涉及空值的 INNOT INANYALL 表达式上。PostgreSQL 使用三值逻辑,表达式可以求值为 true、false 或 null。ClickHouse 对这些操作的默认行为使用二值逻辑。因此,简单的翻译可能会返回 PostgreSQL 本应过滤掉的行。

0.10 版基于表达式的消费方式以及 pg_clickhouse 是否能证明其操作数不可能为 null 添加了保护措施。该方法降低了表面上成功的查询产生细微不同答案的风险。

新的相关子查询路径需要 ClickHouse 25.8 或更高版本。pg_clickhouse 在规划期间会检查服务器版本,当所连接的 ClickHouse 服务器无法处理翻译后的查询时会回退到本地评估。

六个 TPC-H 查询仍未实现完全下推:Q13、Q15、Q16、Q18、Q20 和 Q21。其中若干被阻塞的原因是 PostgreSQL 将它们的子查询转换为其输入包含额外连接的反连接或半连接。pg_clickhouse 的反解析器尚无法遍历该操作两侧的连接树。ClickHouse 将那部分规划器工作识别为下一项主要步骤。

The extension is becoming part of ClickHouse's Postgres strategy

ClickHouse 在 2025 年 12 月推出 pg_clickhouse,以减少在分析数据从 PostgreSQL 迁移时对应用端的额外工作。前提是通过复制移动数据变得更容易,而重写多年嵌入在仪表盘、对象关系映射器和计划任务中的 SQL 仍然代价高昂。

该扩展此后已成为 Postgres managed by ClickHouse 的一个组成部分,该服务在 2026 年 5 月进入公测。该服务将用于事务的 PostgreSQL、将变更数据捕获到 ClickHouse 的流程以及作为跨两个系统查询层的 pg_clickhouse 结合在一起。其战略价值在于保留 PostgreSQL 作为面向应用的接口,同时让 ClickHouse 承担更重的分析执行。

该策略面向那些已经依赖 PostgreSQL 并会抵制完全数据库迁移的客户。它也给工程团队施加了压力,必须支持 PostgreSQL 查询行为的长尾部分,其中兼容性失败通常比明显错误更难被发现。

ClickHouse 有足够资金继续推进这张清单。今年一月,ClickHouse 完成了由 Dragoneer Investment Group 领投的 4 亿美元 D 轮融资,参与者包括 Bessemer Venture Partners、GIC、Index Ventures、Khosla Ventures、Lightspeed Venture Partners、T. Rowe Price 顾问账户和 WCM Investment Management。ClickHouse 在五月表示其已超过 4000 家客户并达到 2.5 亿美元的年经常性收入运行率

0.10 版还围绕 ClickHouse 的纯 C 客户端库重建了二进制驱动,按块流式传输大结果集,增加了压缩和 TLS 控制,并为并发的外部扫描提供独立连接。后者的改动解决了驱动中的并发错误。ClickHouse 还扩展了对统计聚合、有序集合聚合、分区聚合、日期操作和字符串函数的下推支持。

基准性能的提升会引起关注,但 pg_clickhouse 更大的考验是兼容性。Milovidov 围绕快速分析执行构建了 ClickHouse。该公司现在押注于能否在开发者已经信任的 PostgreSQL 接口后面销售这台引擎。Ventura 的子查询工作弥补了若干最昂贵的缺口,但在六个基准查询之外,还有一个更大的生产 SQL 世界等待解决。

Reader comments

Conversation for this story loads after sign-in.