复杂物化视图不能自动刷新的解决方式

今天项目里遇到需要定时刷新数据的问题,我在网上搜索了一下总结如下:

物化视图刷新的模式有两种:On Demand和On Commit。

        On Demand指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。

        On Commit指物化视图在对基表的DML操作提交的同时进行刷新。

刷新的方法有四种:Fast 、Complete 、Force和Never。

        Fast 刷新采用增量刷新,只刷新自上次刷新以后进行的修改。

        Complete 刷新对整个物化视图进行完全的刷新。

        如果选择Force方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用Complete 的方式。

        Never指物化视图不进行任何刷新。

        默认值是Force On Demand。

我们项目无法进行Commit刷新,就做了一个定时任务如下:

--创建视图

CREATE OR REPLACE VIEW VIEW_EXPORT_DATA AS  

SELECT * FROM TABLE1
INNER JOIN
      (table1
      union
      table2
      )


--创建物化视图
CREATE MATERIALIZED VIEW MVIEW_EXPORT_DATA
REFRESH FORCE ON DEMAND
START WITH TO_DATE('11-04-2018 18:58:05', 'DD-MM-YYYY HH24:MI:SS') NEXT SYSDATE+(1/(24*60))
AS
SELECT * FROM VIEW_EXPORT_DATA@ORCL;


--创建存储过程(刷新物化视图)
create or replace procedure refresh_mviews
AS
BEGIN
   dbms_mview.refresh('MVIEW_EXPORT_DATA');  
end refresh_mviews;

--创建job定时任务调用刷新物化视图的存储过程
declare
  job number;
BEGIN
  DBMS_JOB.SUBMIT(  
        JOB => job,  /*自动生成JOB_ID*/  
        WHAT => 'refresh_mviews;',  /*需要执行的存储过程名称或SQL语句*/  
        NEXT_DATE => sysdate,  /*初次执行时间*/  
        INTERVAL => 'sysdate+1/1440' /*每隔1分钟执行一次;*/
      );  
  commit;
end;
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值