用 LLM 优化数据库查询,提速 4.78 倍

深度2026年4月3日6 分钟阅读
用 LLM 优化数据库查询,提速 4.78 倍
传统数据库查询优化器常因统计模型忽略语义关联而选错执行计划。新研究通过 LLM 分析物理执行图,用 JSON Patch 微调连接顺序,在 TPC-DS 查询上实现了最高 4.78 倍的加速。

AI 的进步离不开底层系统基础设施的改进,但这种关系并非单向——AI 和大语言模型(LLM)同样能用来优化大规模系统自身的功能组件。我们最近的研究论文展示了如何用 AI 优化数据库查询。

传统查询优化依赖基于成本的估算器,它使用统计模型和预定义启发式方法来计算执行路径。执行类似 “找出所有涉及太空旅行的科幻剧” 的查询时,优化器必须决定执行策略:是先筛选科幻剧再检查哪些涉及太空旅行,还是反过来?如果数据分布在多个表(例如剧集表和类型表)中,应该先扫描哪个表,以及如何连接它们?优化器通过估算每个条件将匹配多少行来回答这些问题,然后选择预估成本最低的实际计划(操作顺序)。

然而,这些估算通常假设属性独立。 考虑一个流媒体服务数据集,你想找到既是“科幻”又“涉及太空旅行”的剧集。如果 15% 的剧集是科幻剧,8% 涉及太空旅行,假设独立性会估算出 1.2% 的剧集同时满足两个条件(15% × 8%)。但实际上,涉及太空旅行的剧集绝大多数是科幻剧,实际重叠率接近 7%——比预测值高出近 6 倍。

事实上,这些系统通常运行良好,但当启发式方法未能考虑模式或数据内的语义关联时就会出问题。正如 Lohman(2014 年)在一个例子中指出的,基数估计是优化器效率低下的主要根源,因为行数误估会通过成本模型传播,并可能导致系统性地选择错误的连接顺序、访问路径和物理运算符。这种数量级误差会导致次优的物理计划,需要大量工程努力手动纠正。

语义感知的连接优化。通过将选择性的 date 过滤器提前,LLM 重新排序计划,使销售事实表在连接前从 1510 万行修剪到 290 万行,从而获得更快的查询。

查询优化是已解决的问题吗?

这些估计误差的持续存在表明,物理规划并非已解决的问题,尤其是在功能依赖常见的复杂 OLAP 工作负载中。

为了解决这个问题,我们引入了 DBPlanBench,这是一个执行框架(Harness),它暴露了 Apache DataFusion 引擎的查询执行过程。该系统将内部物理运算符图(包括连接策略和分区方案)暴露给 LLM。这里的主要技术挑战是原始物理计划中固有的信息密度,其中包含冗长的文件路径、分区元数据和类型编码,会快速填满上下文窗口(Context Window)。

如果不进行仔细的序列化,整个计划可能超过 200 万个字符,使得 LLM 无法有效且高效地对输入进行推理。我们的执行框架实现了一个序列化层,它遍历引擎的物理运算符图,并将异构对象映射到统一的、节省 Token 的 JSON 模式中。

压缩单个表引擎统计数据的说明性片段。完整的 JSON 包含许多与执行无关的字段(例如 precisionInfo、每列的最小值/最大值和空值计数),而简明的统计数据仅保留主要信号,如 n_rowstotal_bytes

这种表示法去重了文件级统计数据,并移除了与执行无关的字段,产生的负载比原生序列化小约 10 倍。

因此,DBPlanBench 将优化任务从统计计算转换为语义推理问题,其中 LLM 分析计划的拓扑结构以识别连接顺序中的逻辑缺陷。

我们在 DataFusion 内部优化物理计划的优化执行框架。

为了安全地实施这些修复,我们指示 LLM 避免从头开始重新生成整个物理计划;相反,它对 DataFusion 现有的物理计划进行有针对性的编辑,从而降低语法错误或无效计划拓扑的风险。具体来说,LLM 生成描述局部编辑的 JSON Patch(RFC 6902),例如交换连接两侧或重新排序节点。这些补丁比完整计划小几个数量级,并直接应用于序列化图,确保执行 DAG 的结构完整性。

交换 hashJoin 左右输入的 JSON Patch 示例,更新了子节点 ID 和连接键。它说明了如何通过一个小的局部补丁来重写连接(例如,将较小的表放在构建侧),而无需重新生成整个计划。

案例研究

统计估计失败的后果在查询延迟和系统资源消耗方面都是可测量的。在一个源自 TPC-DS 的跨渠道销售查询中,默认的 DataFusion 优化器优先连接较小的商品表(3.6 万行),然后再连接较大的日期维度表(7.3 万行),假设较小的连接成本更低。这种启发式方法未能考虑日期维度上过滤器 d_year=2001 的高选择性。LLM 优化的计划颠倒了这个顺序,提前应用日期过滤器,在后续连接之前将销售事实表从 1510 万行修剪到 290 万行。

这种结构优化使查询速度提高了 4.78 倍。更重要的是,资源占用大幅减少。优化后的计划将哈希表构建总时间从 10.16 秒减少到 0.41 秒,并将总构建内存使用量从 3.3 GB 削减到 411 MB。实验表明,在 TPC-H 和 TPC-DS 的生成查询工作负载上,中位加速比徘徊在 1.1 倍到 1.2 倍左右,并且该方法在一些复杂的多连接查询上也带来了更大的增益,例如加速高达 4.78 倍,其他一些查询在 1.5-1.7 倍范围内。

进化式计划修补

我们通过迭代优化来进化查询计划。系统使用 GPT-5 生成候选改进(通过 JSON Patch),验证每个更改,并保留减少延迟的补丁。一旦应用了这些补丁,系统会尝试再次从新计划开始生成新的候选方案。通过在多个步骤中基于成功的优化进行构建,这种进化方法比简单地独立采样许多计划实现了更好的加速。

并非所有查询都能被有效优化,因为计划可能已经是最优的,但我们发现在我们的抽样数据集中,60.8% 的查询可以被优化超过 5%。下图显示了我们在一个衍生数据集上的改进:

在其中一个测试数据集(120 个查询)上的加速分布。虽然我们可以优化更大比例的查询,但有趣的是,我们可以优化约 30% 的查询,使其加速超过 10%。

跨比例因子迁移加速

我们使用的基准测试暴露了一个比例因子参数,该参数在保持底层模式固定的同时缩放表基数。实际上,这让我们可以构建一个较小的原型数据库(例如,比例因子 3,或 SF3)和一个较大的类似生产环境的数据库(例如,SF10),它们共享相同的结构,但仅大小不同。

因为在全规模数据上探索许多候选计划成本高昂(每个步骤都需要执行查询加上支付并等待 LLM 生成的补丁),我们首先使用进化搜索在 SF3 上发现良好的优化计划。对于每个查询,然后我们使用确定性的、基于规则的脚本将最佳的 SF3 计划迁移到 SF10。该脚本通过规范化的模式/投影/谓词签名匹配跨比例的扫描运算符,并将 SF3 优化计划重写为可运行的 SF10 计划,同时保留结构编辑(如连接重新排序和连接侧交换),并强制执行安全检查(例如,没有悬空引用,有效的 DAG 拓扑)。

经验表明,我们在 SF3 上选择的每个优化计划都可以成功迁移到 SF10,并且由此产生的加速比与原始加速比紧密相关。这验证了一个实用的“小规模优化,大规模部署”工作流:在紧凑的工作负载副本上运行一次昂贵的搜索,然后将结果计划以最小的额外工程工作提升到更大的生产数据库。

在小型 SF3 数据库上发现的加速在很大程度上延续到较大的 SF10 数据库。每个点代表一个查询,比较其在 SF3(x 轴)和 SF10(y 轴)上的加速。

结论

DBPlanBench 证明,LLM 可以有效地充当语义基数估计器,以纠正统计启发式方法遗漏的物理计划错误。通过将紧凑的计划序列化与进化补丁搜索相结合,该系统在不改变核心数据库引擎的情况下,显著减少了执行时间和内存压力。该执行框架和代码已作为开源发布以供进一步研究。

参考文献

Lohman, G. Is query optimization a “solved” problem? ACM SIGMOD Blog, April 2014. URL: https://wp.sigmod.org/?p=1075. Accessed: 2026-01-26.

本文编译自 AI for Systems: Using LLMs to Optimize Database Query Execution,版权归原作者所有。

觉得有用?分享给更多人

获取每周 AI 工具精选

工具推荐、实战教程和生态洞察,每周更新。

相关文章

Simon Willison 正在重构 LLM Python 库的抽象层,以支持服务器端工具执行等新功能。他利用 Claude Code 分析了四大 LLM 提供商的客户端库,生成了用于测试的 curl 命令和 JSON 输出。这些调研材料已开源,旨在帮助设计更通用的 API 抽象。

深度Simon Willison·4月5日·1 分钟

智能体技能——包含程序性知识和可执行资源的结构化包,供智能体在推理时动态加载——已成为增强 LLM 智能体的可靠机制。然而,推理时技能增强存在根本性限制:检索噪声引入无关指导,注入的技能内容带来大量 token 开销,而模型从未真正习得它所遵循的知识。我们提出一个问题:技能是否可以被内化到模型参数中,使其在无需任何运行时技能检索的情况下实现零样本自主行为?我们提出 Skill0,一个专为技能内化设计的上下文强化学习框架。Skill0 引入了一种训练时课程,从提供完整技能上下文开始,逐步撤除。技能按类别离线分组,并与交互历史一起渲染为紧凑的视觉上下文,教授模型工具调用和多轮任务完成。动态课程机制…

深度·4月5日·17 分钟

评论