oracle物化视图的刷新机制

在一些关于数据量比较大的报表时,执行一次的时间是很长的,例如本人最近的一条sql,执行了11个小时也没有出现结果,为了保证客户的使用的良好性,所以需要创建一个物化视图来实现数据的快速查询,物化视图的概念就是将查询完的数据放入到一个视图中,大概可以理解为将数据insert进一张空白的表。物化视图的存在是为了提升查询效率,但是物化视图的执行也是在基于数据库执行一次的基础上进行的,所以如果sql执行很慢的话创建物化视图也很慢。注:本人的sql执行过慢是因为客户需要每天都生成个金额的情况,还具有多个组织,得进行大量的求和运算,所以不是很好提升效率。

create materialized view v_wu refresh COMPLETE start with sysdate next to_date( concat( to_char( sysdate+1,'dd-mm-yyyy'),'23:55:00'),'dd-mm-yyyy hh24:mi:ss') as 你的sql

这里不详细讲解物化视图的用法,前面已经有个大牛写的很详细了,这局话的意思是创建个物化视图v_wu完整刷新,现在开始执行,下次的执行时间是第二天的23.55,到现在为止都是得益于CSDN的大牛们的博客写出来的,本人比较执着于oracle的循环类型的写法,但是并没有找到类似于JAVA的for循环那么好用的,比较类似的有connect by,最起码生成从某一天到现在的每一天日期还是很好用的。

有时遇到有点意思的执行方式,总是忍不住多看看,这里的next用法也不是经常使用(问了个大哥,也是通过博客讲解的),这里比较好奇到底怎么实现每天刷新,在查看已经创建的物化视图发现了这样的代码。

create materialized view V_WU
refresh complete on demand
start with to_date('23-07-2020 23:55:00', 'dd-mm-yyyy hh24:mi:ss') next to_date( concat( to_char( sysdate+1,'dd-mm-yyyy'),'23:55:00'),'dd-mm-yyyy hh24:mi:ss') 

可以看到有一些变化比如 on demand,这个具体的意思就不解释了,令我感兴趣的是里面的时间,oracle将sysdate变成了下一次执行时的时间,然后通过start with对这条语句进行一个唤醒来实现定时刷新,这样下一次执行的时候next的时间又会重新变成start with后面的时间了,通过这样的操作来实现定时执行的作用。

小提示:物化视图有一种可以替代的方式,PLSQL自己也可以进行定时任务,可以先创建一个新的表,并新建一个存储过程,定时执行这个存储过程来往表里插入数据,为了使数据更准确建议先把表清掉,这样比物化视图麻烦在建表时得建好列的类型,不那么灵活。

CREATE OR REPLACE PROCEDURE vb as
BEGIN
  EXECUTE IMMEDIATE 'TRUNCATE TABLE abc';
  INSERT INTO abc
  (一个子查询);
COMMIT;
END;

你可能感兴趣的:(萌新日记)