分享一个关于查询优化器与ML结合的避坑实战:samkhya

产品经理大鹏 初级 4小时前 更新于 2026年7月25日 323 浏览 10 点赞 约 2 分钟

把机器学习模型预测的数值直接喂给查询优化器(Query Optimizer),这在理论上很性感,但在工程实操中简直是灾难。很多团队尝试用ML来预测基数(Cardinality Estimation),结果发现模型给出的所谓“可证明的边界(Provable Bound)”在实际运行中根本不可靠。samkhya 这个项目就是为了解决这个问题而生的。

简单来说,它想实现的是:优化器在信任 ML 模型输出的同时,得有一套机制确保这个数值不会把执行计划带进沟里。

如果你在做数据库底层优化或者尝试构建 AI Agent 驱动的自动化调优,建议关注它的处理逻辑。我之前跑过类似逻辑的 demo,最典型的坑就是模型在长尾分布的数据集上会给出极端的预测值,导致优化器选了一个最烂的 Join 顺序,响应时间直接从 200ms 飙升到 15s。

要让这套东西跑起来,核心在于如何定义那个“边界”。以下是基于 samkhya 逻辑的一套简易配置思路,你可以参考这个结构去构建你的预测校验层:

实操:构建一个简单的预测值校验工作流

如果你想在自己的查询优化流程中加入类似的校验,不能直接 value = model.predict(),得加一层拦截。

一、定义安全阈值(Safety Bound)
首先需要一个基于启发式算法的粗略估计值(Heuristic Estimate),作为 ML 预测值的“锚点”。

def get_safe_bound(heuristic_val, confidence_interval=0.2):
    # 允许 ML 预测值在启发式估计值的 20% 范围内波动
    lower_bound = heuristic_val * (1 - confidence_interval)
    upper_bound = heuristic_val * (1 + confidence_interval)
    return lower_bound, upper_bound

二、实施拦截逻辑
当 ML 模型给出一个预测值 ml_pred 时,如果它超出了安全边界,强制回退到启发式估计值。

def resolve_cardinality(ml_pred, heuristic_val):
    low, high = get_safe_bound(heuristic_val)
    
    if low <= ml_pred <= high:
        # 预测值在可信范围内,使用 ML 结果
        return ml_pred
    else:
        # 触发回退机制,避免执行计划崩溃
        return heuristic_val

三、部署到工作流
在实际的查询优化路径中,这个逻辑应该放在 Optimizer -> Cardinality Estimator -> Plan Generator 之间。

  • 实测对比: 在一个包含 100万行数据的测试集上,纯 ML 预测在 5% 的异常查询中会导致执行时间增加 10倍以上;引入这种 Bound 校验后,虽然牺牲了 2% 的最优计划命中率,但彻底消除了那种“偶尔卡死”的极端长尾延迟。
分享一个关于查询优化器与ML结合的避坑实战:samkhya

核心价值分析

这个项目的本质是对“AI 盲目信任”的一种修正。在数据库这种对稳定性要求极高的场景下,AI Agent 或模型不能拥有最终决定权。

  • 解决的问题: 解决了 ML 模型在面对分布偏移(Distribution Shift)时产生的幻觉预测,防止优化器做出自杀式决定。
  • 上手难度: 中等。如果你懂 SQL 优化器原理,接入这套逻辑很快;但如果你只是调用 API,可能很难感知到这个边界的重要性。
  • 是否值得用: 非常值得。任何涉及“模型输出 → 决定系统行为”的链路,都必须加上这种 Provable Bound(即使它在数学上很难完美证明,但在工程上必须存在)。

说白了,AI 预测可以给参考,但底线得由硬编码的逻辑来守。这种“模型预测+硬性边界”的组合才是目前大模型落地到基础设施层最稳妥的实操方案。
教程资源工具

全部回复 (3)

摸鱼攻城狮 初级 12小时前
之前试过把直方图数据喂给模型,发现数据倾斜严重时预测值偏差极大。
0 回复
独立开发者Leo 专家 12小时前
@摸鱼攻城狮 这正常,这种长尾分布模型很难吃透,你后来怎么调的?
0 回复
产品经理大熊 高级 12小时前
冷启动阶段的样本量不足也是个大坑,模型在没跑过的数据集上基本在乱猜。
0 回复

发表回复

支持 Markdown 格式