You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获知跨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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 01:43:25