执行计划跳变主因是SQL Plan Baseline未生效、未捕获或被绕过;需通过AWR查DBA_HIST_SQLSTAT确认plan_hash_value是否漂移,用DBMS_XPLAN.DISPLAY_AWR('ADVANCED')验证Note中是否显示“SQL plan baseline used”,并核对DBA_SQL_PLAN_BASELINES中ENABLED/ACCEPTED/FIXED三态及RAC多实例一致性。

执行计划跳变不是优化器“变心”,而是基线没生效、没捕获,或被绕过了——AWR是唯一能验证它是否真在起作用的工具。
查DBA_HIST_SQLSTAT确认plan_hash_value是否真漂移
光看v$sql里当前缓存的计划会误判。同一sql_id在7天内若出现多个plan_hash_value,才是漂移铁证。
- 运行这个查询(替换
'your_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);
- 返回多行 → 计划确实漂移;只有一行 → 问题大概率不在执行路径上(比如I/O抖动、锁争用)
-
dba_hist_sql_plan默认每sql_id最多存1000行计划,高频SQL可能被截断,空结果不等于没历史计划
用DBMS_XPLAN.DISPLAY_AWR('ADVANCED')看Note是否写明基线被用
DBMS_XPLAN.DISPLAY_AWR输出里的Note行是硬证据,但必须加'ADVANCED'参数才显示。
- 执行:
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY_AWR('abc123xyz', NULL, NULL, 'ADVANCED')); - 重点找这行:
Note: SQL plan baseline SQL_PLAN_abc123 used for this statement - 没这行?哪怕
DBA_SQL_PLAN_BASELINES里ENABLED=YES,也可能因optimizer_use_sql_plan_baselines=FALSE、或该基线FIXED=YES后未演进新计划而失效 - RAC环境下,得用
gv$sql逐inst_id确认是否都出现该Note,单节点查不准
核对DBA_SQL_PLAN_BASELINES中ENABLED/ACCEPTED/FIXED三态
基线能否参与决策,取决于三个布尔字段组合,不是只要ENABLED=YES就够了。
-
ENABLED=YES:基线可被优化器考虑;=NO→ 直接忽略,不管其他字段 -
ACCEPTED=YES:该计划已通过验证,允许被选中;=NO→ 即使存在也不参与执行选择 -
FIXED=YES:强制锁定该计划,但也会阻断自动演进;升级后若旧基线FIXED=YES且性能差,反而会卡死优化器 - 查法:
SELECT sql_handle, plan_name, enabled, accepted, fixed FROM dba_sql_plan_baselines WHERE sql_text LIKE '%your_key%';
注意RAC多实例下基线加载与一致性
在RAC中,LOAD_PLANS_FROM_CURSOR_CACHE只作用于当前实例,其他节点不会自动同步基线状态。
- 若某SQL在inst_id=1上走了基线,inst_id=2却没走,先查
gv$sql确认两节点是否都显示Note: SQL plan baseline ... used - 加载基线时,需在每个实例上分别执行
DBMS_SPM.LOAD_PLANS_FROM_CURSOR_CACHE,或改用LOAD_PLANS_FROM_SQLSET统一导入 - 更隐蔽的问题:不同实例的
optimizer_features_enable设置不一致,会导致同一基线在不同节点解析出不同计划树
最常被忽略的是:plan_hash_value相同不代表性能稳定——AWR里elapsed_time_total / executions_total同步飙升,但plan_hash_value没变,说明问题在谓词推导、绑定变量值偏移或RAC块传输异常,这些都得靠DBA_HIST_ACTIVE_SESS_HISTORY交叉比对才能揪出来。


















