怎样在Oracle 19c中监控SQL物化视图刷新的耗时与状态

轻涛小哥_5783

轻涛小哥_5783

2026-11-14

517人浏览

原创

真实耗时必须查V$MVREFRESH:刷新前记录DBMS_UTILITY.GET_TIME,刷新后取END_TIME−START_TIME换算秒级耗时;它仅在刷新中或刚结束时可见,需主动轮询,不可依赖滞后更新的DBA_MVIEWS.LAST_REFRESH_DATE。

怎样在oracle 19c中监控sql物化视图刷新的耗时与状态

不能只看 DBA_MVIEWS.LAST_REFRESH_DATE —— 它只存时间点,不存耗时,且更新滞后于实际提交;真实耗时必须从运行时动态视图捕获。

查 V$MVREFRESH 拿单次刷新的精确秒级耗时

这是唯一能拿到“本次刷新执行了多久”的视图,但它只在刷新进行中或刚结束时可见(通常保留几秒到几分钟,取决于系统负载)。关键不是等它“自动出现”,而是主动轮询+计算:

  • 刷新前先记下 DBMS_UTILITY.GET_TIME(毫秒级),或用 SYSDATE
  • 立刻执行 SELECT START_TIME, END_TIME FROM V$MVREFRESH WHERE MVIEW_NAME = 'YOUR_MV_NAME'
  • 若 END_TIME 非空,耗时 = (END_TIME - START_TIME) * 24 * 60 * 60(转成秒)
  • 若 END_TIME 为空,说明还在跑;此时别干等,转去看 V$SESSION_LONGOPS

常见错误:直接查 DBA_MVIEWS.LAST_REFRESH_DATE 算差值。它可能在刷新成功后延迟数秒甚至更久才更新,尤其在高并发或大事务环境下,结果完全不可信。

用 V$SESSION_LONGOPS 监控正在跑的刷新进度

当刷新卡住、变慢、或你怀疑它没动时,V$SESSION_LONGOPS 是第一响应工具。它反映的是 Oracle 内部对“长时间操作”的实时估算,包括 FAST 和 COMPLETE 刷新:

  • 执行 SELECT SID, SERIAL#, OPNAME, TARGET, ROUND(SOFAR/TOTALWORK*100, 2) "%_COMPLETE", SOFAR, TOTALWORK FROM V$SESSION_LONGOPS WHERE OPNAME LIKE 'Refresh%' AND TOTALWORK != 0 AND SOFAR
  • OPNAME 值为 Refresh MV 或 Refresh Fast MV 才是目标
  • %_COMPLETE 不是绝对准确,但能判断是否卡死(比如 5 分钟不动在 1%)
  • 注意:DBA_MVIEWS.LAST_REFRESH_DATE 在这里卡住时纹丝不动,别被它骗了

这个视图不依赖刷新类型,FAST 和 COMPLETE 都会上报;但 ON COMMIT 刷新因在事务内完成,通常太快,很少出现在这里。

QuantOracle
QuantOracle

63个确定性量化金融计算器 + 10个通过MCP的复合工作流。期权定价、Greeks、奇异衍生品、风险指标、投资组合优化……

下载

确认是否真走 FAST 刷新,而非静默降级

即使 DBMS_MVIEW.REFRESH 返回成功,也可能已悄悄退化为 COMPLETE —— 这种“静默降级”最坑人,因为耗时暴涨却无报错:

  • 刷新后立刻查 SELECT FAST_REFRESHABLE FROM DBA_MVIEWS WHERE MVIEW_NAME = 'YOUR_MV_NAME',值必须是 YES 才算真正支持 FAST
  • 查日志表消费情况:SELECT COUNT(*) FROM MLOG$_t WHERE SNAPTIME$$ = TO_DATE('4000-01-01', 'YYYY-MM-DD'),刷新前后对比。差值为 0 → 没走增量;差值非零但耗时高 → 增量逻辑本身慢(比如日志膨胀、基表函数导致无法索引)
  • 运行 EXEC DBMS_MVIEW.EXPLAIN_MVIEW('YOUR_MV_NAME'),查 MVIEW_EXPRESS 表里的 MSGTXT 字段,重点找 "REFRESH FAST IS NOT POSSIBLE" 或 "NO LOG ON BASE TABLE"

ON COMMIT 模式下 FORCE 不会 fallback,但 ON DEMAND 下的 FORCE 就会——这点最容易被忽略。

抓底层 SQL 的执行计划和并行行为

耗时高不一定在 MV 逻辑层,可能卡在生成的刷新 SQL 上。尤其当你传了 parallelism 参数时,得验证它是否真生效:

  • 确保 STATISTICS_LEVEL = TYPICAL(BASIC 下 V$ALL_SQL_PLAN_MONITOR 无数据)
  • 刷新触发后立即查 SELECT KEY, SQL_ID, SQL_EXEC_ID FROM V$ALL_SQL_MONITOR WHERE SQL_TEXT LIKE '%YOUR_MV_NAME%' AND STATUS = 'EXECUTING'
  • 用拿到的 KEY 查 SELECT PLAN_OPERATION, DOP, LAST_DEGREE FROM V$ALL_SQL_PLAN_MONITOR WHERE KEY = :key,看到 PX COORDINATOR 且 DOP > 1 才算并行启动
  • 注意:parallelism 对 FAST 刷新完全无效,只影响 COMPLETE;ON COMMIT 下传该参数会直接报 ORA-12054

真正难定位的,是那些“看起来在跑、进度在动、但就是慢”的刷新——往往卡在基表全表扫描、MVIEW$_ 日志表没索引、或 PGA 不足导致大量临时段写入,这些都得靠 V$ALL_SQL_PLAN_MONITOR 和 DBA_HIST_SQL_PLAN 往下挖。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

oracle

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4983

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

1011

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1309

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

7041

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3703

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

7040

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

9841

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1330

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1172

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程