awr报告能直接锁定自动任务引发的cpu或i/o抖动,关键在于查任务执行时段是否与性能毛刺严格对齐,并交叉验证sql_id、plan_hash_value和dba_scheduler_job_run_details;重点筛查同一sql_id在非业务时段突现多个不同plan_hash_value且执行频次集中爆发的sql,同步比对load profile中redo generated与logical reads的阶梯式跳升及physical reads direct占比超30%等特征,再通过dba_scheduler_job_run_details精确对齐任务启动时间与快照end_interval_time,结合instance efficiency percentages中buffer nowait%跌破99.5%或parse cpu to parse elapsed%低于80%等早期指标综合归因。

AWR报告能直接锁定自动任务(如统计信息收集、备份、物化视图刷新)引发的CPU或I/O抖动,关键不是看“有没有任务”,而是查“任务执行时段是否与性能毛刺严格对齐”,并交叉验证SQL_ID、PLAN_HASH_VALUE和DBA_SCHEDULER_JOB_RUN_DETAILS。
查SQL ordered by CPU Time时,重点筛出“计划哈希值突变+执行频次异常”的SQL
自动任务触发的SQL往往有固定模式:同一sql_id在非业务时段突然出现多个不同plan_hash_value,且executions集中在某几个快照内爆发。这不是应用SQL该有的行为。
- 执行以下语句定位可疑SQL:
SELECT sql_id, plan_hash_value, COUNT(*), MIN(snap_id), MAX(snap_id) FROM dba_hist_sqlstat WHERE snap_id BETWEEN &begin_snap AND &end_snap GROUP BY sql_id, plan_hash_value HAVING COUNT(*) > 1 ORDER BY COUNT(*) DESC; - 若某
sql_id在3个快照中出现4个不同plan_hash_value,基本可判定是统计信息更新后优化器重硬解析所致 - 注意过滤掉
sql_text含DBMS_STATS、DBMS_MVIEW、RMAN等关键字的语句——它们本身就是任务驱动SQL,不是被拖累的受害者
比对Load Profile中Redo Generated与Logical Reads的“阶梯式跳升”
自动任务常伴随批量写入或全表扫描,会在Load Profile里留下非线性痕迹:Redo Generated/sec 和 Logical reads/sec 在某个快照起突然翻倍,并持续2–3个快照后回落。这种阶梯不是业务增长能解释的。
- 例如:前一个快照Logical reads/sec = 8,500,下一个快照跳到24,300,再下一个回落至9,100 → 典型物化视图全量刷新特征
- 同步检查
Physical reads direct是否同步飙升:若Direct Path Read占比超30%,大概率是大表分析或备份操作 - 别只看绝对值,要看变化率:用
(current_value - prev_value) / prev_value计算增幅,>150%即需警惕
从DBA_SCHEDULER_JOB_RUN_DETAILS反向验证任务执行时间
AWR本身不记录任务调度元数据,但DBA_SCHEDULER_JOB_RUN_DETAILS能精确到秒级还原任务执行窗口。必须用它和AWR快照的end_interval_time对齐,否则容易把“任务刚启动”误判为“任务已造成影响”。
- 执行:
SELECT job_name, status, actual_start_date, run_duration FROM dba_scheduler_job_run_details WHERE actual_start_date BETWEEN (SELECT MIN(end_interval_time) FROM dba_hist_snapshot WHERE snap_id = &begin_snap) AND (SELECT MAX(end_interval_time) FROM dba_hist_snapshot WHERE snap_id = &end_snap) ORDER BY actual_start_date; - 注意:任务
actual_start_date通常比AWR快照end_interval_time早3–8分钟——因为AWR采集是滞后采样,而任务是实时触发的 - 若发现
gather_stats_job在14:22:17启动,而14:30快照中SQL ordered by CPU Time榜首出现大量SELECT /*+ ALL_ROWS */ ... FROM "PROD"."ORDERS",基本可闭环归因
盯住Instance Efficiency Percentages里的Buffer Nowait %和Parse CPU to Parse Elapsed %
自动任务常导致内存争用或解析压力突增,这两个指标会比Top 5 Events更早暴露问题。Buffer Nowait %跌破99.5%说明buffer busy waits开始堆积;Parse CPU to Parse Elapsed %低于80%则表明硬解析正卡在CPU上,而非等待I/O。
- Buffer Nowait %低 + Top 5出现
gc buffer busy acquire→ RAC环境下统计信息收集引发热点块争用 - Parse CPU to Parse Elapsed %低 +
SQL ordered by Parse Calls中某sql_id的parse_calls/executions≈ 1 → 自动任务触发了未绑定变量的动态SQL(如EXECUTE IMMEDIATE 'UPDATE t SET c = '||v_val) - 这两个百分比在AWR报告的“Instance Efficiency Percentages”表格里,位置固定,不用算,直接扫一眼即可
真正难的是确认“抖动是否由自动任务引起”,而不是“有没有自动任务”。很多DBA查到job运行就停手,却忽略了任务执行计划是否真的变了、是否真和性能毛刺时间点咬合、是否被其他并发负载掩盖。AWR给的是证据链,不是结论。











