基于 SQLT 的执行计划固化方法解析
在 Oracle 数据库运维与性能优化过程中,执行计划漂移是一个极为常见、也极具风险的问题。
一次错误的执行计划选择,往往会导致 SQL 性能断崖式下降,甚至直接影响核心业务系统。
本文结合 SQLT(SQLTXPLAIN)工具,详细说明如何通过 SQL Profile 的方式,对 SQL 执行计划进行固化,并在必要时进行安全回退,适用于对执行计划稳定性有严格要求的生产环境。
本文内容整理自浙商银行内部 SQL 优化实践文档,仅作技术方法说明。
一、SQL Profile 说明
SQLTXPLAIN(简称 SQLT) 是 Oracle 官方提供的一款非常强大的 SQL 调优诊断工具。
截至文档编写时,SQLT 的最新版本为 2018-07-25.v1。
在实际生产环境中,当用户遇到 SQL 性能问题时,Oracle Support 通常会要求提供大量诊断信息,例如:
• SQL 原文
• 10046 / 10053 Trace
• 对象统计信息
• Optimizer 相关参数
• 执行计划与运行信息等
这些信息的收集过程 非常繁琐,且高度依赖 DBA 对 Oracle 内核机制的理解。
一旦信息不完整,或者采集方式不正确,问题往往难以定位甚至无法解决。
SQLT 工具的价值就在于:
• 自动收集单条 SQL 的完整上下文信息
• 自动分析 SQL 相关对象、统计信息、执行路径
• 生成 SQL Profile 脚本,用于固化 SQL 执行计划
通过 SQLT,可以显著降低 SQL 调优与执行计划稳定控制的复杂度。
二、SQLT 简单实用说明
下面结合实际操作步骤,说明如何使用 SQLT 固化执行计划。
2.1 上传文件
上传 sqlt.zip 文件,并进行解压。
进入解压目录后,在 utl 目录 中,可以看到我们需要使用的所有脚本文件。
2.2 运行分析脚本
切换到 Oracle 用户,并以 SYSDBA 身份登录数据库:
su - oracle
$ sqlplus "/ as sysdba"
执行 SQL Profile 转换脚本:
SQL>@coe_xfr_sql_profile.sql cdwjdd67x27mh
说明:
cdwjdd67x27mh 为出现性能问题的 SQL 对应的 SQL_ID
2.3 输入对应的希望固化的执行计划
脚本运行后,会列出该 SQL 对应的所有执行计划信息,例如:
SQL_ID (required)
PLAN_HASH_VALUE AVG_ET_SECS
--------------- -----------
2979024279 .011
647855111 5.164
Oracle 会根据输入的 SQL_ID,找出该 SQL 的所有历史执行计划。
此时,需要 DBA 人工判断 哪一个执行计划是期望被固化的。
选择正确的 PLAN_HASH_VALUE 并输入:
Parameter 2:
PLAN_HASH_VALUE (required)
Enter value for 2: 2979024279
确认信息如下:
Values passed:
~~~~~~~~~~~~~
SQL_ID : "cdwjdd67x27mh"
PLAN_HASH_VALUE: "2979024279"
2.4 运行输出结果
上述步骤完成后,系统会提示执行生成的 SQL Profile 脚本:
Execute coe_xfr_sql_profile_cdwjdd67x27mh_2979024279.sql
on TARGET system in order to create a custom SQL Profile
with plan 2979024279 linked to adjusted sql_text.
执行该脚本:
SQL>@coe_xfr_sql_profile_cdwjdd67x27mh_2979024279.sql
脚本执行完成后,即完成 SQL Profile 的创建与执行计划固化。
2.5 检查固化情况
通过查询系统视图 DBA_SQL_PROFILES,检查 SQL Profile 是否已生效:
SQL> select name, SQL_TEXT, status from dba_sql_profiles;
确认对应 SQL Profile 状态为 ENABLED,即表示固化成功。
三、回退 SQL Profile
在生产环境中,如果发现固化后的执行计划并不符合预期,或者引入了新的性能问题,应及时进行回退操作。
3.1 查找固化 SQL
通过前述查询方式,找出需要回退的 SQL Profile:
SQL> select name, SQL_TEXT, status from dba_sql_profiles;
记录对应的 Profile 名称。
3.2 删除固化
执行以下命令删除 SQL Profile:
SQL> exec dbms_sqltune.drop_sql_profile('coe_f4sgavkagjb1q_2593387201');
删除完成后,该 SQL 将恢复为优化器自行选择执行计划。
总结
通过 SQLT 工具配合 SQL Profile,可以:
• 有效解决执行计划漂移问题
• 在不修改 SQL 代码的前提下稳定性能
• 具备可控、可回退的安全机制
但需要注意的是:
执行计划固化是一把"双刃剑"
它要求 DBA 对业务 SQL、数据分布、执行路径具备充分理解,
否则错误固化可能带来更严重的系统风险。
在核心业务系统中,建议将 SQL Profile 固化作为谨慎使用的高级调优手段,并配合完整的验证与回退策略。