暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

Oracle SQL Profile 固化执行计划实战说明

基于 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 固化作为谨慎使用的高级调优手段,并配合完整的验证与回退策略。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论