如何获知跨dblink创建的物化视图的刷新完成耗时?
如何追踪物化视图每次刷新的耗时
给你几个实用的方案来追踪物化视图每次刷新的耗时:
1. 通过系统视图计算时间差
如果用的是Oracle,DBA_MVIEW_REFRESH_TIMES会记录物化视图的历次刷新时间,你可以通过计算相邻两次刷新的时间差得到耗时。执行以下SQL:
SELECT mview_name, last_refresh_date, lag(last_refresh_date) OVER (PARTITION BY mview_name ORDER BY last_refresh_date) AS prev_refresh_date, ROUND((last_refresh_date - lag(last_refresh_date) OVER (PARTITION BY mview_name ORDER BY last_refresh_date))*24*60, 2) AS refresh_duration_minutes FROM dba_mview_refresh_times WHERE mview_name IN ('你的物化视图名1', '你的物化视图名2') ORDER BY mview_name, last_refresh_date;
注意:第一次刷新的记录没有前一次时间,会显示null;如果是增量刷新,这个时间差就是实际刷新耗时。
2. 自定义刷新日志表(最准确直观)
自己建一个日志表,每次刷新物化视图时记录开始、结束时间,直接算出耗时,还能记录刷新类型和失败状态。
步骤1:创建日志表
CREATE TABLE mview_refresh_log ( mview_name VARCHAR2(128) NOT NULL, refresh_start DATE NOT NULL, refresh_end DATE, refresh_duration_minutes NUMBER, refresh_type VARCHAR2(10) -- 记录FULL/FAST/COMPLETE等刷新类型 );
步骤2:写刷新存储过程
CREATE OR REPLACE PROCEDURE refresh_mview_with_log(p_mview_name IN VARCHAR2, p_refresh_type IN VARCHAR2 DEFAULT 'FULL') AS v_start DATE; BEGIN v_start := SYSDATE; -- 执行刷新 DBMS_MVIEW.REFRESH(p_mview_name, p_refresh_type); -- 写入成功记录 INSERT INTO mview_refresh_log (mview_name, refresh_start, refresh_end, refresh_duration_minutes, refresh_type) VALUES (p_mview_name, v_start, SYSDATE, ROUND((SYSDATE - v_start)*24*60, 2), p_refresh_type); COMMIT; EXCEPTION WHEN OTHERS THEN -- 写入失败记录 INSERT INTO mview_refresh_log (mview_name, refresh_start, refresh_end, refresh_duration_minutes, refresh_type) VALUES (p_mview_name, v_start, SYSDATE, ROUND((SYSDATE - v_start)*24*60, 2), p_refresh_type || '_FAILED'); COMMIT; RAISE; -- 抛出异常,保留原有错误信息 END; /
步骤3:调用存储过程刷新
每次刷新时调用这个存储过程就行:
EXEC refresh_mview_with_log('你的物化视图名'); -- 或者指定增量刷新 EXEC refresh_mview_with_log('你的物化视图名', 'FAST');
之后查询日志表就能看到所有刷新的耗时:
SELECT * FROM mview_refresh_log ORDER BY refresh_start DESC;
3. 利用数据库审计(需提前配置)
如果你的数据库已经开启了审计功能,可以审计DBMS_MVIEW.REFRESH操作,审计记录里会包含操作的开始和结束时间,通过时间差就能算出耗时。不过这个需要提前配置审计策略,适合有审计需求的场景。
内容的提问来源于stack exchange,提问作者bprasanna
相关产品推荐
相关产品推荐

