在数据库优化过程中,执行计划的稳定性尤为关键。YashanDB 提供的 Outline(执行计划轮廓)功能,可以确保即使外部环境发生变化,SQL 语句也能维持原有计划不变。本文通过一系列典型场景验证 Outline 的可靠性与适用性,帮助你系统理解这一核心特性。

image.png
一、验证环境与背景说明

通过如下场景全面测试 Outline 是否在以下情境中依然生效:

统计信息失效的情况下;

SQL 绑定变量场景;

主备环境中;

数据库版本升级后。

二、核心场景验证结果

  1. 数据量变化导致统计信息失效

创建两张测试表,各插入 200 万数据;

收集统计信息并验证执行计划为 Hash Join;

创建索引后,计划变为 Nested Loop;

删除索引后计划回滚;

创建 Outline 后,即便索引存在,仍强制使用 Hash Join;

持续插入新数据、导致统计信息失效,仍优先使用 Outline 指定计划。

结论:Outline 有效屏蔽统计信息波动的影响。

  1. 绑定变量场景下验证

创建绑定变量的 SQL Outline(含 ? 占位符);

执行绑定语句,自动匹配 Outline;

即便语句中包含 HINT,优化器仍优先采纳 Outline 执行路径。

结论:绑定变量语句与 Outline 能成功匹配执行计划。

  1. 单机主备架构中验证

主库、备库均开启 Outline 功能;

在主库创建 Outline,观察执行计划;

在备库执行相同 SQL,初始无 Outline;

在备库手动开启相同类别 Outline 功能;

执行计划保持一致,轮廓成功生效。

结论:主备节点需分别开启 Outline 功能,生效后一致稳定。

  1. 数据库版本升级后的执行计划稳定性

在 22.2.10.100 版本中创建 Outline;

升级至 23.2.3.100;

重新验证相同 SQL 的执行计划;

无论数据库默认优化路径是否改变,Outline 计划均优先使用。

结论:Outline 在版本升级后依旧有效,兼容性强。

三、Outline 创建与使用关键指令

创建 Outline 示例:

CREATE OUTLINE ol_af FOR CATEGORY ctgy_ab ON
select distinct t2.col2. t3.col1
from test_tab2 t2
join test_tab3 t3 on t2.col2 = t3.col1
where t2.col2 = 3
limit 10;

激活指定类别 Outline:

ALTER SESSION SET USE_STORED_OUTLINES = ctgy_ab;

查看当前 SQL 使用的 Outline:

SELECT * FROM USER_OUTLINE_HINTS WHERE name = 'OL_AF';

image.png
四、实践建议

适用于核心 SQL 的执行计划锁定,避免因索引、统计信息变化导致性能波动;

建议以 SQL Hash 或文本为依据管理 Outline,保障匹配精度;

主备、升级等场景应提前验证 Outline 是否仍有效,确保系统稳定性。


数据库砖家
1 声望0 粉丝