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

相关推荐
TttHhhYy17 小时前
小记,antd design vue的下拉选择框,选项部分不跟着滑动走,固定在屏幕某个部位,来改
前端·vue.js·sql
Dr.Alex Wang17 小时前
Google Firebase 实战教学 - Streamlit、Bucket、Firebase
数据库·python·安全·googlecloud
程序 代码狂人18 小时前
SQL-速查表:NULL 相关函数对比
数据库·sql
kaico201818 小时前
MYSQL的日志文件
数据库·mysql
oMcLin18 小时前
如何在AlmaLinux 9上优化MariaDB Galera Cluster,提升数据库集群的事务一致性与并发处理能力?
数据库·mariadb
yuankunliu18 小时前
【redis】1、Redis的安装部署
数据库·redis·缓存
model200518 小时前
mariadb系统盘迁移数据盘
数据库·mariadb
码农学院18 小时前
使用腾讯翻译文本
服务器·数据库·c#
@zulnger19 小时前
正则表达式
数据库·正则表达式