
十年前,Leis等人曾发出灵魂拷问:查询优化器究竟有多好?十年后,答案依然令人沮丧:尽管相关研究汗牛充栋,查询优化器的表现仍难言理想。
这看似反直觉。PostgreSQL理应对其存储的数据了如指掌,但事实是,查询优化器中的核心任务——连接顺序(Join Ordering)——是一个公认的NP-hard问题。构建完美的优化器难如登天,但验证一个查询计划的优劣却相对简单:执行时间越短,计划越好。这种“结果易于验证”的特性,恰好契合语言模型在强化学习中的优势。
一项最新实验证实,一个小规模的开源权重模型,完全可以通过监督微调(SFT)和代理式强化学习(RL),生成优于PostgreSQL默认设置的查询计划。
核心成果
- 性能显著提升:在113个高度依赖连接的查询中,实现了44.7%的延迟降低。值得注意的是,该4B模型在初始状态下甚至无法为其中99个查询生成有效计划。
- 噪声抑制框架:构建了专用的PostgreSQL测量框架,最大限度减少了并发容器间Linux页面缓存争用带来的噪声。
- 算法创新:设计了自定义的GRPO变体,用于在固有嘈杂的环境中评估强化学习回合(rollouts)。
- 分布式训练架构:将强化学习任务分布在不同硬件上——vLLM和训练器运行在租赁的2x H100节点,而四个PostgreSQL容器则部署在本地办公桌上。
- 离策略蒸馏:在半千条GPT-6 Astra智能体轨迹上运行了离策略蒸馏。
为何优化如此困难?
以IMDb数据集为例,假设我们要查询“2000年代发布标题最多的日本公司”。PostgreSQL面临的核心挑战并非执行查询,而是决定表的连接顺序。
若不加过滤条件,无论以何种顺序连接title、movie_companies和company_name三张表,中间结果集基数可能相同。但一旦加入“日本公司”和“2000-2009年”的选择性谓词,连接顺序的影响便呈指数级放大:
- 顺序A:先过滤出5%的日本公司,再与电影公司表连接,最后关联标题表。中间结果集较小。
- 顺序B:先过滤出20%的2000年代标题,再与电影公司表连接。由于数据分布不均,中间结果集可能激增。
若选择错误的连接顺序,工作量可能是最优方案的4倍甚至更多。更棘手的是,每次连接还可选择哈希、合并或嵌套循环等不同算法,加上四种扫描方式(顺序、索引、仅索引、位图),一个简单的三表连接查询竟有4,608种不同的执行路径。
估算的陷阱
PostgreSQL无法在规划阶段精确“计数”,只能依赖pg_statistic中的统计信息进行估算。它假设数据均匀分布,即第一张表中某值的频率可直接映射到第二张表。然而,现实数据往往严重偏斜。例如,若5%的日本公司实际上制作了50%的电影,基于均匀分布假设的成本模型将彻底失效,导致优化器选择次优计划。
早期连接中的一个微小估算误差,会在整个连接树中级联放大,最终导致性能崩盘。
如何“驾驭”大象
既然无法直接修改PostgreSQL源码中的成本模型,如何引导其选择更优计划?答案是利用第三方扩展pg_hint_plan。通过在SQL语句中添加结构化注释,用户可以强制PostgreSQL采用特定的连接算法或扫描方式。
基于此,研究团队提出了核心假设:语言模型能否学会生成能产生更好查询计划的提示?
研究并未试图在一次性查询上击败PostgreSQL极速的默认优化器,而是聚焦于重型分析工作负载。对于反复运行的查询,预先花费数十到数百次执行的成本进行训练,从而在长期运行中分摊成本并大幅提升效率,具有极高的实用价值。
实验架构:小模型与大智慧
团队选用了一个4B参数的小规模模型——empero-ai/Qwen3.8-4B-Distill。该模型由德国实验室Empero发布,基于Qwen 3.8教师模型蒸馏而来。尽管其在通用数学推理上略逊于基础模型,但在广义知识评估上表现更佳,适合此类任务。
研究构建了轻量级代理框架qo-agent,赋予模型六大工具能力,包括检查关系结构、获取列统计信息、评估候选计划等。代理被指示生成PlanAction JSON对象,并通过pg_hint_plan将其转化为PostgreSQL可执行的提示。
基准测试与防过拟合
实验采用两个经典基准:
- JOB (Join Order Benchmark):包含113个基于IMDb的真实查询,用于验证性能。
- CEB (Cardinality Estimation Benchmark):包含约1.36万个合成查询,用于模型训练。
为防止模型死记硬背,团队严格剔除了CEB中与JOB查询拓扑结构(即连接图)相同的查询,确保模型学习到的是通用的优化策略,而非特定查询的答案。
在基础设施方面,团队巧妙结合了云端算力与本地资源:训练和推理部分依托租赁的H100节点,而数据库交互部分则在本地桌面的PostgreSQL容器中运行,既保证了训练效率,又模拟了真实的本地部署环境。