物化视图刷新堵塞需通过ash时间窗过滤(最近5分钟waiting状态)、阻塞链分析(优先final_blocking_session)、等待事件特征(enq: tx、library cache lock等)及v$session.program(j000/m000)综合定位,而非依赖sql_id或直接关键字。

物化视图刷新引发的系统堵塞,ASH里根本不会直接标出“MV refresh”字样——你看到的全是 enq: TX - row lock contention、library cache lock 或 SQL*Net message from client 这类表层等待,必须靠时间窗、会话状态和阻塞链交叉验证才能定位到真实源头。
查不到刷新会话?先锁死时间窗+WAITING状态
ASH默认缓存约1小时数据,但物化视图刷新卡住往往只持续几分钟。不加过滤条件,结果全是噪音。
- 必须同时满足:
SAMPLE_TIME > SYSDATE - 5/1440(最近5分钟)且session_state = 'WAITING' - 漏掉任一条件,
blocking_session可能指向已结束的会话,或混入大量 CPU RUNNING 样本干扰判断 - 刷新相关等待集中在:
event LIKE 'enq: TX%'(行锁争用)、event = 'library cache lock'(TRUNCATE触发)、event = 'SQL*Net message from client'(下游查询因一致性读变慢)
为什么 blocking_session 总是空?该看 final_blocking_session
物化视图刷新(尤其 ATOMIC_REFRESH => TRUE)常引发 A→B→C 级联阻塞:刷新会话A持锁 → 应用会话B等A → 查询会话C等B。ASH采样瞬间,B可能刚释放锁,导致 blocking_session 为空。
- RAC环境下必须查
gv$active_session_history,并优先使用final_blocking_session和final_blocking_instance -
final_blocking_session = 0或NULL,说明它是根阻塞源——大概率就是那个没设atomic_refresh => FALSE的刷新任务 - 别用
CONNECT BY直接连v$active_session_history,会报ORA-32043;先用WITH物化目标窗口数据再递归
如何确认是 MV 刷新而非普通业务 SQL 在捣鬼
物化视图刷新的 SQL 在 ASH 中不可见(它走的是内部 PL/SQL 调用路径),但它的行为有强特征:
- 同一
sql_id高频出现于多个会话样本中,且CURRENT_OBJ#指向物化视图基表或日志表(如MLOG$_SALES) - 等待事件集中于
enq: TM - contention(刷新写日志时锁基表)或library cache lock(ATOMIC_REFRESH => TRUE触发 TRUNCATE) - 关联
v$session查该会话的program字段:常见值为oracle@host (J000)(job slave)或oracle@host (M000)(mmon slave),不是应用名
刷新卡在 REFRESHING 状态?立刻查 v$session_longops
DBMS_MVIEW.REFRESH 执行后长时间无返回,不是“卡了”,而是正在后台跑一个长操作——v$session_longops 会暴露它卡在哪一步。
- 执行:
SELECT opname, target, sofar, totalwork, units FROM v$session_longops WHERE opname LIKE '%refresh%' AND time_remaining > 0 - 若
opname是Merge into MV_SALES_DAILY,说明 FAST 刷新正尝试合并增量;若卡在Delete from MV_SALES_DAILY,基本可断定是ATOMIC_REFRESH => TRUE导致 undo 暴涨 - 此时别杀会话——直接查
user_mviews.staleness,若已是STALE或UNUSABLE,说明刷新已失败,需先修复依赖(如重建日志)再重试
最易被忽略的一点:物化视图刷新本身不产生高负载 SQL_ID,但它会让所有查该 MV 的会话陷入 read consistency 等待——这种“隐形堵塞”在 ASH 里表现为大量 SQL*Net message from client 长等待,而你却在 v$sql 里找不到对应 SQL。这时候得倒推:从等待客户端 IP 入手,反查它最近访问的是哪个物化视图。











