最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Oracle中如何监控物化视图刷新任务的进度与耗时
时间:2026-07-11 09:53:45 编辑:袖梨 来源:一聚教程网
查不到V$SESSION_LONGOPS不表示刷新未进行,因该视图仅记录超6秒且触发Oracle长操作机制的任务;物化视图刷新若处理少量变更或直接读MLOG$_表,则不会进入此视图。
查不到 V$SESSION_LONGOPS 就代表没在刷新?
不是。v$session_longops 只收录执行超 6 秒、且触发 oracle 内部长操作注册机制的步骤(比如全表扫描、大排序、并行 dml),而物化视图刷新若只处理几行变更、或直接从 mlog$_ 表读取少量日志,根本不会进这个视图——它压根没走到 longops 路径。
常见误判场景:
-
DBA_MVIEWS.LAST_REFRESH_DATE没更新,但V$SESSION_LONGOPS返回空 → 刷新可能早结束了,也可能卡在锁等待或元数据检查阶段 - 手动执行
DBMS_MVIEW.REFRESH('MV_NAME', 'F')后立刻查V$SESSION_LONGOPS→ 若日志里只有 3 行变更,执行时间不到 1 秒,自然不出现 -
opname字段查不到Refresh materialized view→ 说明当前刷新没走 longops 路径,别在这儿死磕
怎么确认刷新任务真在跑、卡在哪一步?
刷新本质是后台会话在执行 SQL(INSERT、MERGE、DELETE),不是独立服务。关键不是找“刷新专用视图”,而是定位这个会话。
实操建议:
- 用
SELECT sid, serial#, sql_id, event, state FROM V$SESSION WHERE program LIKE '%mview%' OR module LIKE '%DBMS_MVIEW%'找出疑似刷新会话;确认state = 'ACTIVE'且sql_id非空 - 拿
sql_id去查V$SQL.sql_text,看是否在扫大基表、做聚合、或写入MV$表 - 重点盯
event字段:db file scattered read表示读基表中,enq: TX - row lock contention表示被事务锁住了,row cache lock常见于高并发 DDL 后未及时刷新元数据
AWR 报告里怎么看刷新是否准时、耗时是否异常?
AWR 不记录“REFRESH”动作本身,但能还原后台作业(DBMS_SCHEDULER 或 DBMS_JOB)的执行时间、耗时和资源消耗——这才是判断实际刷新是否按预期发生的唯一可靠方式。
生成 AWR 报告后,盯这三处:
-
SQL ordered by CPU Time:搜索含
DBMS_MVIEW.REFRESH字样的调用,或匹配INSERT INTO "MV_NAME"、SELECT FROM "MLOG$_的语句;这些 SQL 的executions次数就是该时段内实际刷新发生次数 -
Background Processes(在 Instance Activity Stats 下方):查看
background cpu time和background elapsed time是否在刷新窗口附近突增;高值说明后台作业密集运行 -
Top 5 Timed Events:若
db file sequential read或direct path write在固定整点(如每小时 0 分)集中爆发,大概率对应定时刷新任务
想精确知道某次刷新花了多久、间隔是否稳定?
AWR 是宏观视图,细粒度执行记录得查数据字典。下面这条 SQL 直接告诉你某刷新作业最近 7 天是否准时、间隔是否稳定:
SELECT job_name, status, actual_start_date, TRUNC((actual_start_date - LAG(actual_start_date) OVER (PARTITION BY job_name ORDER BY actual_start_date)) * 24, 2) AS hours_since_last FROM dba_scheduler_job_run_details WHERE job_name LIKE '%REFRESH%' AND actual_start_date >= SYSDATE - 7 ORDER BY actual_start_date DESC;
注意:hours_since_last 是基于 actual_start_date 计算的间隔,但不能反映单次刷新内部耗时;要查单次耗时,得结合 V$SESSION 中该会话的 logon_time 和 last_call_et,或查 DBA_SCHEDULER_JOB_RUN_DETAILS 的 actual_start_date 和 actual_end_date 字段。
真正容易被忽略的是:ON COMMIT 刷新根本不会出现在调度视图里——它绑定在每个事务提交上,此时必须看 Top 5 Timed Foreground Events 是否出现异常的 enq: TX - row lock contention 或 log file sync。
相关文章
- 空洞骑士丝之歌深渊物品有哪些 07-29
- 少儿趣配音app如何添加收货地址 07-29
- 三国天下归心袁绍英雄玩法 袁绍英雄玩法攻略 07-29
- 西行乱斗八仙班变脸流玩法攻略 07-29
- 三国天下归心蔡文姬英雄玩法 蔡文姬英雄玩法攻略 07-29
- 洛克王国世界咕噜球如何制作 洛克王国世界咕噜球制作方法 07-29