物化视图-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;

image

  • 定时刷新
    image

image

image

  • 手动刷新
    image
posted @   丹心石  阅读(55)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示