oceanbase Hint、Outline 以及 SPM 均可以用来管理执行计划,我们应该分别在怎样的场景下使用 Hint、 Outline 和 SPM?

在 OceanBase 中,HintOutlineSPM(SQL Plan Management) 虽然都用于管理执行计划,但它们的定位和使用场景有明显区别。以下是三者的适用场景对比:

1. Hint —— 开发阶段的手动干预

适用场景:

  • SQL 开发/调优阶段:当你编写 SQL 时,明确知道优化器选择的计划不是最优的,希望在代码层面直接指定执行计划。

  • 临时性能测试:需要快速验证某种执行路径(如强制走索引、指定 Join 顺序、禁用改写等)对性能的影响。

  • 特定查询优化:针对个别复杂查询,优化器因统计信息缺失或成本估算偏差导致选错计划。

特点:

  • 直接嵌入 SQL 语句中,如 SELECT /*+ INDEX(t1 idx1) */ * FROM t1 ...

  • 需要修改应用代码,不适合线上紧急修复(如果业务代码无法立即变更)。

  • 粒度最细,仅影响当前语句。

2. Outline —— 线上应急的计划绑定

适用场景:

  • 线上业务已上线,无法修改 SQL 代码:当生产环境出现性能问题,且优化器选择了次优计划,但业务代码无法立即变更时,通过 DDL 方式在线绑定执行计划。

  • 应急固定计划:作为临时止血手段,快速稳定性能,避免计划跳变导致故障。

  • V4.x 之前的版本:在 OceanBase V4.x 之前,系统没有自动化的计划管理能力,Outline 是主要的计划固定手段。

特点:

  • 通过 CREATE OUTLINE 语句将一组 Hint 绑定到特定 SQL,无需修改业务代码

  • 可以基于 SQL_TEXT(原始 SQL)或 SQL_ID(参数化后的 SQL)创建,生产环境推荐使用 SQL_ID 方式以避免格式匹配问题 。

  • 属于被动应急措施,需要 DBA 手动识别问题 SQL 并创建绑定。

示例场景:

业务上线后发现某条 SQL 因统计信息变化从走索引变成了全表扫描,导致 CPU 飙升。此时可以立即创建 Outline 绑定索引计划,无需发版修改代码。

3. SPM —— 系统级的自动化计划管理(推荐用于 V4.x+)

适用场景:

  • 长期计划稳定性保障:在 OceanBase V4.x 及以上版本,SPM 提供了系统级自动化的计划固定和演进能力,是首选方案

  • 防止计划退化:避免由于统计信息更新、数据分布变化、版本升级等原因导致执行计划从好变坏("计划变化"问题)。

  • 大小账号问题:当同一条 SQL 因参数不同(如 c1=0 vs c1=1)导致复用了不优计划时,SPM 可以通过基线机制保证使用已验证的优计划。

  • 计划演进:自动捕获新生成的计划,通过灰度验证其性能,只有验证通过后才替换旧计划,实现"性能不断优化且稳定"。

特点:

  • 自动化:开启 optimizer_capture_sql_plan_baselinesoptimizer_use_sql_plan_baselines 后,系统自动捕获和验证计划。

  • 持久化:Plan Baseline 持久化存储已验证的计划信息,重启后依然有效。

  • 可演进:支持计划从好变坏时的自动修复,也支持新计划验证后自动升级。

  • V4.x 之前版本有缺陷:V4.0 之前的版本禁止使用 SPM,存在 schema 内存占用大、影响 DDL 和重启等问题。

总结对比表

表格

维度 Hint Outline SPM
介入时机 开发/测试阶段 线上应急 长期稳定运行
修改代码 需要 不需要(DDL) 不需要(自动)
自动化程度 手动 手动 自动捕获 + 演进
持久化 随 SQL 语句 持久化到系统表 持久化基线
适用版本 全版本 全版本(V4.x 前主要手段) V4.x 及以上推荐
典型场景 开发调优、验证计划 线上紧急止血、无法改代码 系统级计划稳定、防止计划退化

实践建议

  1. 开发阶段:优先使用 Hint 进行计划调优和验证,确认最优计划路径。

  2. 上线后应急:如果无法立即修改代码,使用 Outline 快速绑定计划,作为临时解决方案 。

  3. 长期治理(V4.x+):开启 SPM,利用其自动化捕获和演进能力,实现系统级的执行计划稳定性。如果系统从未生成过好计划,SPM 无法无中生有,此时仍需结合 Hint 或 Outline 干预,或联系技术支持排查优化器缺陷 。