随着 pgrust v0.4-beta 的发布,其全新查询引擎 Gravity 在 ClickHouse 官方基准测试 ClickBench 中表现强劲,最高速度达到 ClickHouse 的 3 倍。值得注意的是,Gravity 在实现这一性能突破的同时,完整保留了 Postgres SQL 语法和类型系统的支持。

核心理念:“光速编程”与多阶段编译

Gravity 的开发摒弃了传统的自下而上优化路径,转而采用“光速编程”理念:从硬件和文件格式的物理速度极限出发,逆向推导数据库的性能天花板。团队通过编写针对列式存储高度优化的独立 Rust 程序作为性能基准(即“光速”),目标是将 SQL 查询的 JIT 编译性能提升至该基准的 80% 到 90%。

为实现这一目标,Gravity 构建了一个灵活的多阶段编译器管道,将高级 Postgres 计划逐步降级为原始汇编代码:

SQL Query -> Postgres Plan -> Pipeline Graph -> Lisp IR -> Assembly

这种架构避免了硬编码执行模式,允许引擎根据查询需求动态生成最优机器码。

三大关键优化策略

通过对比手工优化的 Rust 代码与 Gravity 生成的 IR,团队实施了超过 100 项优化,其中三项对性能提升至关重要:

1. 函数内联与聚合优化
传统 Postgres 在每行数据上通过函数管理器进行调用,开销巨大。Gravity 将 238 个核心函数和聚合直接内联到 Lisp IR 中。基准测试显示,仅 AVG 函数的内联就将每行指令数从 392 条降至 120 条,查询速度提升 2.56 倍。

2. 延迟物化与字典过滤
针对字典编码的文本列,Gravity 采用延迟物化策略,尽可能长时间地操作整数字典代码而非字符串。对于 LIKE 等过滤器,引擎会生成位图标记匹配的字典代码,并可在内存中缓存重用,避免重复的子字符串匹配。在计算 MIN(URL) 等聚合时,直接比较整数代码而非字符串,大幅降低计算成本。

3. 寄存器中的运行折叠
利用数据在磁盘上的局部性特征,Gravity 跟踪当前组键并将其保存在 CPU 寄存器中。只要连续行的键值相同,仅需递增寄存器计数器,仅在组切换时才探测哈希表。在亿级数据表中,这一优化可将哈希表探测次数从 1 亿次大幅减少至 2200 万次。

算法升级与通用性保障

除了编译优化,pgrust 规划器还引入了三种特定于列式存储的新算法,以弥补标准 Postgres 计划的不足:

  • ZoneWalk:利用粒度元数据的最小/最大值边界,按顺序读取数据块,在找到足够的 ORDER BY ... LIMIT n 结果后立即停止扫描。
  • ZoneTopK:类似 ZoneWalk,针对 GROUP BY ... LIMIT n 查询,利用元数据遍历粒度,一旦确定前 N 个组即可提前终止。
  • TwoPass:针对高基数 GROUP BY 查询,先通过单列计数确定潜在的大组,再获取其余列数据,从而节省内存带宽。

为确保优化的通用性而非过拟合,团队建立了包含模糊测试器的优化目录,验证各项优化在不同数据类型和查询形状下的有效性。

性能基准:超越 PostgreSQL 千倍

最终测试结果显示,Gravity 的运行时 JIT 编译时间低于 1 毫秒,执行性能仅比手工编写的 Rust 代码慢 10% 到 20%。在与原版 Volcano 行执行器的隔离对比中,Gravity 冷启动速度快 102 倍,热启动速度快 499 倍。

在 c6a.4xlarge 机器上的 ClickBench 综合得分中,pgrust v0.4-beta 比 PostgreSQL 17 高出 1,000 倍以上,冷启动性能优势更是达到 1,365 倍。这一成果标志着 pgrust 在保持 Postgres 兼容性的同时,实现了分析型查询性能的质的飞跃。