写点什么

YashanDB|一文读懂 Outline 功能实战验证:绑定、失效、主备、升级全覆盖!

作者:数据库砖家
  • 2025-04-30
    广东
  • 本文字数:963 字

    阅读完需:约 3 分钟

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

一、验证环境与背景说明

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

统计信息失效的情况下;

SQL 绑定变量场景;

主备环境中;

数据库版本升级后。

二、核心场景验证结果

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

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

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

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

删除索引后计划回滚;

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

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

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

2. 绑定变量场景下验证

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

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

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

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

3. 单机主备架构中验证

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

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

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

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

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

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

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

在 22.2.10.100 版本中创建 Outline;

升级至 23.2.3.100;

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

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

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

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

创建 Outline 示例:

CREATE OUTLINE ol_af FOR CATEGORY ctgy_ab ONselect distinct t2.col2. t3.col1from test_tab2 t2join test_tab3 t3 on t2.col2 = t3.col1where t2.col2 = 3limit 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 是否仍有效,确保系统稳定性。

用户头像

还未添加个人签名 2025-04-09 加入

还未添加个人简介

评论

发布
暂无评论
YashanDB|一文读懂 Outline 功能实战验证:绑定、失效、主备、升级全覆盖!_数据库_数据库砖家_InfoQ写作社区