游乐游手机版
首页/数据库/文章详情

如何通过Oracle AWR分析执行计划是否发生变化

时间:2026-08-15 07:08
判断执行计划是否发生漂移,最直接的证据是同一个 sql_id 在 dba_hist_sql_plan 与 dba_hist_sqlstat 中对应了多个 plan_hash_value;实际排查时,通常还要结合分组统计、DISPLAY_AWR 对比谓词与基数估算,以及检查基线在跨实例环境中的生效状态

判断执行计划是否发生漂移,最直接的证据是同一个 sql_iddba_hist_sql_plandba_hist_sqlstat 中对应了多个 plan_hash_value;实际排查时,通常还要结合分组统计、DISPLAY_AWR 对比谓词与基数估算,以及检查基线在跨实例环境中的生效状态,才能做出准确结论。

如何通过Oracle AWR判断执行计划发生变化

先查 AWR 中是否存在多个 plan_hash_value

判断 Oracle 执行计划有没有“变”,不能凭感觉或单次执行现象,而要看 dba_hist_sql_plandba_hist_sqlstat 里是否出现了多个 plan_hash_value。同一个 sql_id 一旦对应多个 hash 值,基本就可以认定发生过执行计划漂移。

可以先执行下面这条 SQL(将 'your_sql_id' 替换为实际的 SQL ID):

SELECT plan_hash_value, COUNT(*), MIN(sample_time), MAX(sample_time)
FROM dba_hist_sql_plan p
JOIN dba_hist_sqlstat s USING (sql_id, plan_hash_value)
WHERE sql_id = 'your_sql_id' AND sample_time > SYSDATE - 7
GROUP BY plan_hash_value
ORDER BY MIN(sample_time);
  • 如果返回多行 → 说明该 SQL 的执行计划确实发生过变化,下一步继续分析原因
  • 如果只返回一行 → 性能变差大概率不是执行路径切换导致,建议优先排查 I/O、锁等待、内存压力等问题
  • dba_hist_sql_plan 默认对每个 sql_id 最多保留 1000 行计划记录,高频 SQL 可能出现截断;因此查不到结果,并不代表历史上没有执行计划

DBMS_XPLAN.DISPLAY_AWR 检查谓词和预估行数是否异常

即使 plan_hash_value 没变,也不代表执行效果一定一致。比如统计信息陈旧或分布失真时,cardinality 的预估可能严重偏差(例如预估 100 行,实际却返回 10 万行),进而引发嵌套循环放大、临时表空间占满、响应时间陡增等性能问题。

为了看到真实绑定变量取值以及基线使用情况,建议必须带上 +PEEKED_BINDS+NOTE 参数:

SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR(
sql_id=> 'your_sql_id',
plan_hash_value => 1234567890,
db_id => 123456789,
format=> 'BASIC +PEEKED_BINDS +NOTE'
));
  • 重点关注 access 是否真正命中了索引列,filter 是否没有成功下推到存储层
  • 如果 cardinality 的预估值和实际值相差 10 倍以上,通常就可以怀疑是统计信息不准确或失真
  • 如果不加 +PEEKED_BINDS,就无法看到绑定变量的真实值,判断谓词选择性时很容易出现误判
  • 出现 “no rows selected” 并不一定表示执行计划不存在,也可能是并行执行计划或递归调用信息没有被完整记录下来

逐行比对 dba_hist_sql_plan 中的 OPERATIONPREDICATES

plan_hash_value 本质上只是一个哈希标识,某些结构上的细微变化(例如谓词下推位置调整、索引扫描由唯一扫描变成范围扫描)未必会改变 hash,但对 SQL 性能的影响可能非常明显。因此,不能只依赖 hash 值来判断执行计划是否“真的变了”。

要进一步定位变化发生在哪一步,最好按快照做对比:

SELECT sql_id, plan_hash_value, snap_id
FROM dba_hist_sqlstat
WHERE sql_id = 'your_sql_id'
AND snap_id IN (12345, 12346)
ORDER BY snap_id;
  • 拿到两个快照对应的 plan_hash_value 后,再分别使用 DBMS_XPLAN.DISPLAY_AWR 导出完整执行计划,进行文本 diff 对比
  • 重点比较字段包括:OPERATIONOPTIONSOBJECT_NAMEACCESS_PREDICATESFILTER_PREDICATES
  • 一个常见误区是:AWR 报告首页的 “Top SQL” 表格通常只展示当前快照里的 hash,无法直接看出历史上的执行计划漂移情况

在 RAC 环境下必须跨实例确认 SQL Plan Baseline 是否真正生效

在 RAC 集群中,同一个 sql_id 在不同实例节点上可能采用不同执行计划,即使显示出的 plan_hash_value 完全相同也不能掉以轻心。AWR 中的 plan_hash_value 是全局视角,但基线是否启用、是否被 accepted,往往需要按实例分别确认。

  • 检查基线状态时,不能只看 DBA_SQL_PLAN_BASELINES,还应结合 gv$sql 验证每个 inst_id 上是否真正使用了目标基线
  • 可通过 DBMS_XPLAN.DISPLAY_AWR(..., 'ADVANCED') 查看 Note 信息,确认是否出现 SQL plan baseline used
  • LOAD_PLANS_FROM_CURSOR_CACHE 只能加载当前仍存在于库缓存中的计划;如果目标好计划已经老化掉,就需要先从 AWR 提取,再导入 SQLSET
  • 在 RAC 环境中,仅在单节点执行 LOAD_PLANS_FROM_CURSOR_CACHE 往往无法满足需求,必须按跨实例方式处理

真正麻烦的地方,往往不只是确认 plan_hash_value 发生过变化,而是要进一步找出:到底哪一次变化,对应的才是那个性能稳定的“好计划”。很多时候,它可能藏在三天前某个凌晨的 AWR 快照里,既没有被 SQL Plan Baseline 收录,也早已不在当前库缓存中。到了这种场景,最有价值的交叉验证手段,往往只剩下结合 DISPLAY_AWRADVANCED 格式输出中的 Note、谓词细节以及行数估算信息,逐步还原执行计划变化的真实过程。

来源:https://www.php.cn/faq/2988519.html
上一篇MySQL多表连接完整指南:内连接与左外连接右外连接 下一篇Oracle Data Guard解决ORA-16826错误的方法与排查步骤
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Redis是什么:核心特性、架构与应用场景解析
数据库 · 2026-09-01

Redis是什么:核心特性、架构与应用场景解析

Redis是一款基于内存的键值型NoSQL数据库,以超高读写速度和丰富的数据结构著称。本文系统梳理Redis的核心特性、架构组成、性能优势及典型应用场景,并通过与Memcached、MySQL、MongoDB的对比,帮助开发者快速判断Redis是否适合当前业务需求。

Windows 安装 MongoDB 完整图文教程
数据库 · 2026-09-01

Windows 安装 MongoDB 完整图文教程

本文详细介绍在 Windows 系统上安装 MongoDB 的完整流程。从官网下载 MSI 安装包开始,逐步演示自定义安装路径、配置 Windows 服务、跳过 MongoDB Compass 等关键选项,并提供通过系统服务列表验证安装是否成功的方法,帮助开发者快速搭建本地 MongoDB 环境。

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动
数据库 · 2026-09-01

Linux 安装 MongoDB 完整指南:依赖配置、环境变量与服务启动

本文详解在 Linux 系统下安装 MongoDB 的完整流程,涵盖依赖包安装、二进制包下载解压、环境变量配置、数据与日志目录创建及服务启动验证。通过标准化命令与路径说明,帮助开发者快速完成部署并确认服务状态。

MacOS安装MongoDB完整教程
数据库 · 2026-09-01

MacOS安装MongoDB完整教程

本文介绍在MacOS系统下安装MongoDB的完整流程,涵盖下载、解压、目录配置、环境变量设置及服务启动。通过明确的命令与参数说明,帮助开发者快速完成环境搭建并验证安装结果。

Ubuntu系统安装与配置Redis完整指南
数据库 · 2026-09-01

Ubuntu系统安装与配置Redis完整指南

本文详解在Ubuntu系统中安装Redis的两种主流方式:apt在线安装与源码编译安装。涵盖版本选择逻辑、服务启停与状态检查、连接验证方法,以及在线练习工具与桌面GUI客户端的对比与使用建议,帮助开发者快速搭建并验证Redis运行环境。