awr报告中物化视图刷新慢的根因需结合等待事件与执行计划定位:重点查dbms_mview.refresh对应sql id的top event(如enq: tx - row lock contention、log file sync)及execution plan中是否出现load table conventional、merge或lob write等关键操作,而非仅看elapsed time。
awr报告里怎么看物化视图刷新慢的根因
直接看dbms_mview.refresh调用在awr中对应的sql id,再查它的top event和execution plan——90%的“刷新慢”其实不是mv逻辑本身的问题,而是底层资源争用或执行路径错误。别只盯着“elapsed time”,重点看enq: tx - row lock contention、direct path write temp、log file sync这三类等待事件是否高占比。
从AWR里定位ATOMIC_REFRESH是否被忽略
如果DBMS_MVIEW.REFRESH的SQL执行计划里出现MERGE或INSERT ... SELECT(而非TRUNCATE + INSERT /*+ APPEND */),说明atomic_refresh => FALSE没生效。常见原因:
- 物化视图定义含
GROUP BY或JOIN,Oracle强制退回到原子模式 -
method => 'C'没显式传入,系统按默认值走 - 目标表空间空闲区碎片化严重,
INSERT /*+ APPEND */自动降级为常规插入
查v$sql_plan确认实际执行路径:SELECT operation, options FROM v$sql_plan WHERE sql_id = 'xxx' AND operation = 'LOAD TABLE CONVENTIONAL' —— 出现这个就代表Append没走通。
用AWR识别并行参数是否真起作用
刷新期间查v$px_session和v$session_longops,但AWR里更可靠的是看SQL ordered by CPU Time和SQL ordered by Gets两个部分:
- 如果同一SQL ID下只有一条记录,且
Executions= 1,基本是串行执行 - 如果
Parallel Servers Started列有值(在SQL Detail页),且Parallel Queuing Duration占比低,才算真正并行 -
Rows Processed远小于基表总行数,说明刷新中途被中断或退化为FAST(但日志不支持)
特别注意:AWR快照间隔默认60分钟,若刷新耗时短于这个周期,可能根本捕不到该SQL——需临时调小快照间隔或改用ASH实时查v$active_session_history。
LOB字段导致的隐式性能断层怎么从AWR发现
哪怕物化视图只定义了一个CLOB列,AWR里也会暴露异常特征:
-
SQL ordered by Buffer Gets中,该SQL的Buffer Gets/Row远高于同类MV(常达1000+) - 执行计划里出现
LOB Locator或LOB WRITE操作节点 -
Wait Event Histogram中db file sequential read占比突增(LOB chunk读取随机性高)
此时parallelism参数基本无效,因为LOB复制路径不参与并行DML调度——AWR里Parallel Servers Started会显示0,即使你传了parallelism => 8。
真正要盯住的不是AWR里的汇总数字,而是每个刷新动作背后是否触发了预期的物理路径:TRUNCATE还是MERGE,Append还是Conventional,单事务还是多事务。这些细节藏在执行计划和等待事件里,不在报表首页,得往深一层挖。











