摘自百度百科的定义:物化视图和视图类似,反映的是某个查询的结果,但是和视图仅保存SQL定义不同,物化视图本身会存储数据,因此是物化了的视图。
根据刷新方式分为完全刷新和快速刷新(增量刷新)
手动刷新和自动刷新
create materialized view 【物化视图名】
segment creation immediate
refresh
complete或fast或force ---完全或快速或自动选择
on demand或commit --手动刷新或自动刷新
start with sysdate next sysdate+1 ---定时刷新
as 【select语句】
1.完全刷新物化视图
--创建表
create table patient(id number not null,
name varchar2(10),
sex varchar2(2),
age number,
birth_addr varchar(20),
reg_date date
)
--插入几条数据
insert into patient values(1,'一号','男','10','北京',sysdate);
insert into patient values(2,'二号','女','15','西安',sysdate);
insert into patient values(3,'三号','男','12','北京',sysdate);
insert into patient values(4,'四号','男','10','西安',sysdate);
insert into patient values(5,'五号','女','10','北京',sysdate);
--创建完全刷新物化视图,complete即完全刷新,完全刷新是把表truncate后重新导入数据,demand是手动刷新
create materialized view patient_mv
segment creation immediate
refresh
complete
on demand
as
select a.birth_addr birth_addr, count(a.id) sl
from patient a
group by a.birth_addr
;
--物化视图系统视图查看
select * from user_mviews
--查看物化视图生成的对象,一张表+一个物化视图
select object_name,object_type from user_objects where object_name like '%PATIENT_MV%'
--查看雾化视图中的数据
select * from patient_mv;
--向主表中添加数据
insert into patient values(6,'六号','男','10','南昌',sysdate);
insert into patient values(7,'七号','女','15','太原',sysdate);
--demand物化视图不会自动刷新,'C'代表完全刷新,‘F’代表快速刷新
exec dbms_mview.refresh('patient_mv','C');
2.快速刷新物化视图
--创建快速刷新物化视图,快速刷新只刷新变化的数据,快速刷新需要创建物化视图日志表
create materialized view log on patient with rowid,sequence(id,birth_addr,age) including new values;
--建错了就删掉重建 drop materialized view log on patient
--创建快速自动刷新物化视图,这边刚开始报ORA-12033错误,是因为前面创建日志没有写rowid,sequence里面也要把所有用到的列都写进去
create materialized view patient_fast_mv
segment creation immediate
refresh
fast
on commit
as
select a.birth_addr birth_addr,a.age age, count(*) sl
from patient a
group by a.birth_addr,a.age
;
--查询物化视图内容
select * from patient_fast_mv
--插入数据试试
insert into patient values(8,'八号','女','15','太原',sysdate);
insert into patient values(9,'九号','男','15','北京',sysdate);
--重新查看视图,发现数据已成功刷新
select * from patient_fast_mv;
--修改物化视图刷新方式为定时刷新,方便测试2分钟刷新一次
alter materialized view patient_fast_mv
refresh
fast
on demand
start with sysdate next sysdate+2/24/60
select sysdate,sysdate+1/24/60 from dual
--增加数据
insert into patient values(10,'十号','男','10','大连',sysdate);
--查询日志数据
select * from mlog$_patient
--查看物化视图更新情况
select * from patient_fast_mv
--发现物化视图一直没刷新,问度娘,大神们还是有办法,原来权限不够
【在sqlserver developer中执行show parameter job_queue_processes(在plsql中对应select value from v$parameter where name='job_queue_processes'),发现结果为0,这就是问题所在了,value为0时代表任意方式创建的job都不会执行。
解决方式:执行alter system set job_queue_processes =5(需要管理员权限,值要大于等于1),提交,再回去看user_jobs表,发现next_time更新过来了。
————————————————
版权声明:本文为CSDN博主「兰调意识流」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/u013272574/article/details/87182027
】
3.物化视图组,可通过创建物化视图组,实现在同一个时间点批量刷新
--创建物化视图组
begin
dbms_refresh.make(
name=>'mv_patient_group', --视图组名称
list=>'patient_mv,patient_fast_mv', --包含的物化视图
next_date=>sysdate-10, --下次刷新日期
interval=>'sysdate+1' --刷新间隔
);
end;
--创建后,可根据以下语法查看组的操作细节
select * from user_refresh;
--更改物化视图组
exec dbms_refresh.change(name=>'mv_patient_group',interval=>sysdate+5);
--在物化视图组中添加成员
exec dbms_refresh.add(name=>'mv_patient_group',list=>'a_mv,b_mv');
--在物化视图组中删除成员
exec dbms_refresh.subtract(name=>'mv_patient_group',list=>'a_mv,b_mv');
--刷新物化视图组
exec dbms_refresh.refresh('mv_patient_group');
--删除物化视图组,不删除物化视图
exec dbms_refresh.destory('mv_patient_group');