物化视图-2
物化视图分类:
1.包含聚合的物化视图
2.质保函连接的物化视图
3.嵌套物化视图
三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。创建物化视图时可以指定多种选项,下面对集中主要的选择进行简单说明:
1.创建方式(BuildMethods)包括Build Immediate 和 Build defered
build Immediate
是在创建物化视图时就生成数据
build defered
则是在创建时不生成数据,以后根据需要生成数据,默认为build immediate
2.重写查询(QueryRewrite)包括Enable Query和Disable Query Rewrite
查询重写是指当对物化视图的基表进行查询时, oralce会自动判断是否通过查询物化视图得
到结果,如果可以,则避免聚集和连接操作,而直接从已经计算好的物化视图中读取数据.默
认为 Disable Query Rewrite
3.刷新(Refresh):指当基表发生dml操作后,物化视图采用那种方式和基表同步。
刷新模式有两种:on demand 和 on commit,两者区别在于刷新方法不同
On demand 指物化视图在用户需要的时候进行刷新,可以手工通过dbms_mview.refresh等方
法来进行刷新,也可以通过job定时进行刷新,即更新物化视图,以保证和基表数据的一致性
。
而on commit 是说,一旦有了commit 即事务提交,则立刻刷新,立刻更新物化视图,使得数
据和基表一致。对应基表,平常commit在0.01秒内可以完成,但在有了on commit视图后,居
然要6秒,速度低了很多
物化视图,根据不同的这种店可以有不同分类:
1.按刷新方式:fast/complete/force
2.按刷新时间的不同:on demand/on commit
3.按是否可更新:updatable/read only
4.按是否支持查询重写:enable query rewrite/disablequery rewrite
物化视图有三种刷新方式:complete、fast、force
1.完全刷新(complete) 会删除表中所有记录(如果是单表刷新,可能会采用truncate的方
式),然后根据物化视图中查询语句的定义重新生成物化视图
2.快速刷新(fast) 采用增量刷新机制,只将自上次刷新以后对基表进行的所有操作刷新到物
化视图中去,fast必须创建基于基表的视图日志.对于增量刷新选项,如果在子表中存在分析
函数,则物化视图不起作用。
3.采用force方式,oracle 会自动判断是否满足快速刷新的条件,如果满足则进行快速刷新
,否则进行完全刷新
示例
drop table sales
--创建基表
create table sales(Id integer,ProductName varchar2(50),UnitPrice number(8,2),Count integer,Cost number(8,2),SaleDate date,
constraint sales_pk primary key(Id)
);
--创建序列
drop sequence sales_seq;
create sequence sales_seq start with 1 nocycle;
--创建触发器
create or replace trigger tr_sales_insert
before insert on sales
for each row
begin
select sales_seq.nextval into :new.Id from dual;
select (:new.UnitPrice*:new.Count) into :new.Cost from dual;
select sysdate into :new.SaleDate from dual;
end;
--插入测试数据
insert into sales(ProductName,UnitPrice,Count) values('篮球',125.5,4);
commit;
select * from sales;
--创建物化视图
create materialized view sales_mv
build immediate --1. build immediate 创建视图时加载数据 2.build defered 不加载数据
disable query rewrite --1.enable query rewrite 从物化视图读取数据 2.从基表读取数据 (查询分析器在遇到查询基表的sql语句时的优先策略)
as
select * from sales;
--在基表上创建监控日志
create materialized view log on sales; --默认为 with primary key 如果没有主键可以 with rowid
--查询物化视图
select * from sales_mv; --因为使用了 build immediate 因此可以查到从基表加载过来的数据
--刷新物化视图 刷新时间间隔,每1天刷新一次,时间为凌晨10点
alter materialized view sales_mv refresh force on demand
start with sysdate next to_date(concat(to_char(sysdate+1,'yyyy-mm-dd'),'10:29:00'),'yyyy-mm-dd,HH24:mi:ss');
--插入测试数据
insert into sales(ProductName,UnitPrice,Count) values('足球',186.7,6);
insert into sales(ProductName,UnitPrice,Count) values('羽毛球',37.2,12);
select * from MLog$_Sales; --基表执行了DML ,日志表中就有数据
--查询物化视图
select * from sales_mv; --数据还没有被加载,因为未到定时刷新时间
--手工执行快速刷新
select * from user_jobs;
begin
dbms_mview.refresh('sales_mv','f'); --参数2 f (fast)快速刷新 c (complete) 完全刷新
--dbms_refresh.refresh('sales_mv'); --方法2是刷新包中封装的方法,可直接传入物化视图名称进行刷新
end;
- 定时刷新
- 手动刷新
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!