← 返回题目列表

Oracle SQL Plan Baseline 是什么?和 Hint、SQL Profile 有什么区别?

困难 第 28 / 32 题 更新于 2026/07/30
OracleSQL Plan Baseline执行计划

简化版

SQL Plan Baseline 是 Oracle SQL Plan Management 的能力,用来记录并控制 SQL 可接受的执行计划,防止统计信息变化或版本升级导致计划突然劣化。它比 Hint 更集中可管理,和 SQL Profile 的侧重点也不同。

详细版

执行计划可能因为统计信息、绑定变量、优化器版本变化而改变。Baseline 可以保存已验证的好计划,让优化器优先选择可接受计划。

Hint 写在 SQL 里,侵入代码;SQL Profile 更偏给优化器补充校正信息;Plan Baseline 更偏计划稳定性管理。

它适合核心 SQL 稳定性治理,但不能替代索引、统计信息和 SQL 本身优化。错误 baseline 也可能锁住差计划。

完整版教学

一、为什么需要计划稳定性

Oracle 优化器会根据统计信息、参数和环境选择执行计划。多数时候这是好事,但核心 SQL 如果突然换计划,可能从 100ms 变成 30s。

例如一条订单查询平时走索引,统计信息刷新后改成全表扫描,高峰期就可能拖垮系统。

SQL Plan Baseline 的目标是让核心 SQL 的计划变化可控,而不是完全禁止优化器。

二、Baseline 基本思想

Baseline 记录某条 SQL 的可接受执行计划。优化器生成候选计划后,会优先选择 baseline 中被接受的计划。

SQL -> 优化器生成候选计划 -> 和 baseline 对比 -> 选择已接受计划

新计划可以被捕获,但需要验证后接受。这就把计划变化从“自动冒险”变成“受控演进”。

三、和 Hint 的区别

Hint 直接写在 SQL 里,告诉优化器倾向某种路径。它简单直接,但侵入代码,迁移和维护困难。

Baseline 不需要改业务 SQL,可以在数据库层管理计划。对第三方系统或历史系统,baseline 更适合 DBA 治理。

方式优点缺点
Hint直接、明确侵入 SQL,易过时
SQL Profile校正估算依赖诊断调优能力
Baseline稳定计划可能固定旧计划

四、和 SQL Profile 的区别

SQL Profile 更偏向给优化器补充统计校正,让它更准确估算基数,从而选择更好计划。Baseline 更偏限制可用计划集合,强调稳定。

可以粗略理解:

SQL Profile:帮优化器看得更准
Plan Baseline:给优化器可选计划边界

二者都不是万能药。SQL 本身写得差、索引缺失、数据分布剧变,仍要从根因优化。

五、Baseline 的风险

如果 baseline 固定的是一个在旧数据量下很好、在新数据量下很差的计划,它会阻止优化器选择新好计划。

例如表从 100 万行增长到 5 亿行,旧索引路径不再合适,baseline 却仍让 SQL 走旧计划,性能会下降。

所以 baseline 需要定期演进、验证和清理,不是一次设置永久安全。

六、常见误区与追问

  • 误区:Baseline 能让所有 SQL 自动变快。 它主要稳定计划,不负责修复差 SQL。
  • 误区:有 Baseline 就不用维护统计信息。 统计信息仍影响候选计划和其他 SQL。
  • 误区:Hint、Profile、Baseline 是同一类东西。 Hint 是指令,Profile 偏校正估算,Baseline 偏计划控制。
  • 追问:什么时候适合用 Baseline? 核心 SQL 计划抖动、升级前后计划稳定性治理。
  • 追问:Baseline 有什么风险? 可能固定过时计划,需要验证和演进。

七、加强记忆

记忆钩子:Baseline 像给核心 SQL 设置“认可路线清单”,司机还能选路,但只能在审核过的路线里选。

回答这题要讲计划为什么会变、Baseline 如何稳定计划、和 Hint/Profile 的边界,以及固定差计划的风险。这样才是 DBA 视角的答案。