在数据库优化过程中,执行计划的稳定性尤为关键。YashanDB 提供的 Outline(执行计划轮廓)功能,可以确保即使外部环境发生变化,SQL 语句也能维持原有计划不变。本文通过一系列典型场景验证 Outline 的可靠性与适用性,帮助你系统理解这一核心特性。
一、验证环境与背景说明
通过如下场景全面测试 Outline 是否在以下情境中依然生效:
统计信息失效的情况下;
SQL 绑定变量场景;
主备环境中;
数据库版本升级后。
二、核心场景验证结果
- 数据量变化导致统计信息失效
创建两张测试表,各插入 200 万数据;
收集统计信息并验证执行计划为 Hash Join;
创建索引后,计划变为 Nested Loop;
删除索引后计划回滚;
创建 Outline 后,即便索引存在,仍强制使用 Hash Join;
持续插入新数据、导致统计信息失效,仍优先使用 Outline 指定计划。
结论:Outline 有效屏蔽统计信息波动的影响。
- 绑定变量场景下验证
创建绑定变量的 SQL Outline(含 ? 占位符);
执行绑定语句,自动匹配 Outline;
即便语句中包含 HINT,优化器仍优先采纳 Outline 执行路径。
结论:绑定变量语句与 Outline 能成功匹配执行计划。
- 单机主备架构中验证
主库、备库均开启 Outline 功能;
在主库创建 Outline,观察执行计划;
在备库执行相同 SQL,初始无 Outline;
在备库手动开启相同类别 Outline 功能;
执行计划保持一致,轮廓成功生效。
结论:主备节点需分别开启 Outline 功能,生效后一致稳定。
- 数据库版本升级后的执行计划稳定性
在 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';
四、实践建议
适用于核心 SQL 的执行计划锁定,避免因索引、统计信息变化导致性能波动;
建议以 SQL Hash 或文本为依据管理 Outline,保障匹配精度;
主备、升级等场景应提前验证 Outline 是否仍有效,确保系统稳定性。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。