Outline 与 SPM 同时存在且指向不同计划时,谁的优先级更高?

【使用版本】OceanBase 社区版 V4.2.x

【问题描述】

  1. Hint / Outline / SPM baseline 三者的优先级顺序是什么?三者冲突时最终生效的是哪个?
  2. Outline 必须在 SQL 所在 Schema 下创建才生效 —— 如果同一条 SQL 被跨 Schema 调用(比如通过同义词或 DB Link),Outline 会在哪一侧生效?
  3. SPM 默认关闭,开启后 baseline 的演进(plan evolution)是自动完成的还是需要人工确认?会不会因为统计信息变化,把原本的好计划演进成坏计划?
  4. 生产上做计划固定,你更推荐 Outline 还是 SPM?两者能叠加使用吗?

@论坛小助手

Outline 与 SPM 的优先级及使用建议

根据您的问题,我将从以下几个方面进行详细解答:

  1. Hint / Outline / SPM baseline 的优先级顺序
  2. Outline 在跨 Schema 调用时的生效位置
  3. SPM 计划演进的默认行为及注意事项
  4. 生产环境下计划固定的推荐方法

1. Hint / Outline / SPM baseline 的优先级顺序

  • Hint 的优先级最高。如果在 SQL 语句中直接使用了 Hint,优化器会优先遵循这些 Hint 来生成执行计划。
  • Outline 次之。当 SQL 语句没有显式包含 Hint 但有绑定的 Outline 时,优化器会依据 Outline 中指定的一组 Hint 来生成执行计划。
  • SPM baseline 最低。只有在没有 Hint 和 Outline 的情况下,优化器才会考虑 SPM baseline 中存储的历史执行计划。

因此,在三者同时存在且指向不同计划的情况下,最终生效的是 Hint。如果没有 Hint,则是 Outline。最后才是 SPM baseline。

2. Outline 在跨 Schema 调用时的生效位置

Outline 必须在 SQL 所属的 Schema 下创建才能生效。对于通过同义词或 DB Link 跨 Schema 调用的 SQL 语句,其所属的 Schema 是指最初定义该 SQL 语句的那个 Schema。也就是说,Outline 会在 SQL 原始定义的 Schema 一侧生效。例如,如果一个 SQL 语句是在 Schema A 中定义,并通过同义词或 DB Link 在 Schema B 中调用,那么为这条 SQL 创建的 Outline 应该位于 Schema A 中,也只有在这种情况下它才能生效。

3. SPM 默认关闭,开启后的计划演进机制

  • SPM(SQL Plan Management)默认是关闭的状态。要启用 SPM 功能,需要手动设置相关参数如 optimizer_use_sql_plan_baselines 为 1(详情见文档片段 5)。
  • 当 SPM 开启后,基线计划的演进过程可以是自动完成的。这意味着系统会自动检测新生成的计划与已有计划之间的性能差异,并可能替换现有计划。
  • 统计信息的变化确实有可能导致原本表现良好的计划变成较差的计划。这是因为在某些场景下,随着数据分布或其他环境因素的变化,原先最优的执行路径可能不再适用。为了避免这种情况,可以通过定期更新统计信息、调整优化器参数或者锁定特定版本的执行计划来保持稳定性。

4. 生产上做计划固定推荐的方法

  • 更推荐使用 SPM 来管理执行计划。相比于 Outline,SPM 提供了更多灵活性和自动化程度,能够更好地适应变化中的数据库环境。
  • 两者理论上是可以叠加使用的。即可以先利用 SPM 管理大部分 SQL 语句的执行计划,对于少数关键查询则采用更加严格的 Outline 绑定以确保绝对稳定。不过,在实际操作中建议优先选择其中一种方法,以简化管理和维护工作量。

希望以上信息对您有所帮助!如果还有其他疑问,请随时提问。

检索到的文档如下:

  1. 阅读和管理 OceanBase 数据库 SQL 执行计划
  2. DISPLAY_SQL_PLAN_BASELINE
  3. optimizer_use_sql_plan_baselines
  4. oceanbase.DBA_SQL_PLAN_BASELINES
  5. 执行计划管理