在 OceanBase 中,Hint、Outline 和 SPM(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=0vsc1=1)导致复用了不优计划时,SPM 可以通过基线机制保证使用已验证的优计划。 -
计划演进:自动捕获新生成的计划,通过灰度验证其性能,只有验证通过后才替换旧计划,实现"性能不断优化且稳定"。
特点:
-
自动化:开启
optimizer_capture_sql_plan_baselines和optimizer_use_sql_plan_baselines后,系统自动捕获和验证计划。 -
持久化:Plan Baseline 持久化存储已验证的计划信息,重启后依然有效。
-
可演进:支持计划从好变坏时的自动修复,也支持新计划验证后自动升级。
-
V4.x 之前版本有缺陷:V4.0 之前的版本禁止使用 SPM,存在 schema 内存占用大、影响 DDL 和重启等问题。
总结对比表
表格
| 维度 | Hint | Outline | SPM |
|---|---|---|---|
| 介入时机 | 开发/测试阶段 | 线上应急 | 长期稳定运行 |
| 修改代码 | 需要 | 不需要(DDL) | 不需要(自动) |
| 自动化程度 | 手动 | 手动 | 自动捕获 + 演进 |
| 持久化 | 随 SQL 语句 | 持久化到系统表 | 持久化基线 |
| 适用版本 | 全版本 | 全版本(V4.x 前主要手段) | V4.x 及以上推荐 |
| 典型场景 | 开发调优、验证计划 | 线上紧急止血、无法改代码 | 系统级计划稳定、防止计划退化 |
实践建议
-
开发阶段:优先使用 Hint 进行计划调优和验证,确认最优计划路径。
-
上线后应急:如果无法立即修改代码,使用 Outline 快速绑定计划,作为临时解决方案 。
-
长期治理(V4.x+):开启 SPM,利用其自动化捕获和演进能力,实现系统级的执行计划稳定性。如果系统从未生成过好计划,SPM 无法无中生有,此时仍需结合 Hint 或 Outline 干预,或联系技术支持排查优化器缺陷 。