马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
目次
一、什么是物化视图
二、创建物化视图的语法
三、案例知识点
1.创建手动刷新的物化视图
2.创建字段刷新的物化视图,和上例一样的结果集
3.创建时不天生数据的物化视图
4.创建增量刷新的物化视图
5.创建全量刷新的物化视图
一、什么是物化视图
视图是一个假造表(也可以认为是一条语句),基于它创建时指定的查询语句返回的结果集。每次访问它都会导致这个查询语句被实行一次。为了克制每次访问都实行这个查询,可以将这个查询结果集存储到一个物化视图(也叫实体化视图)。
物化视图与普通的视图相比的区别是物化视图是建立的副本,它类似于一张表,需要占用存储空间。
而对一个物化视图查询的实行效率与查询一个表是一样的。
二、创建物化视图的语法
- create materialized view view_name
- [build immediate | build deferred ]
- refresh [fast|complete|force]
- [
- on [commit | demand ] | start with (start_time) next
- (next_time)
- ]
- as
- subquery
复制代码 build immediate 是在创建物化视图的时候就天生数据
build deferred 则在创建时不天生数据,以后根据需要再天生数据。
默认为 build immediate。
刷新( refresh ):指当基表发生了 DML 操纵后,物化视图何时采用哪种方式和基表举行同步。
refresh 后跟着指定的刷新方法有三种:fast、complete、force。
fast 刷新采用增量刷新,只刷新自前次刷新以后举行的修改。
complete 刷新对整 个物化视图举行完全的刷新。
如果选择 force 方式,则 Oracle 在刷新时会去判断是否可以举行快速刷新,
如果可以则采用 fast 方式,否则采用 complete的方式
force 是默认的方式。
刷新的模式有两种:on demand 和 on commit 。
on demand 指需要 手动刷新物化视图(默认)。
on commit 指在基表发生 commit 操纵时主动刷新。
三、案例知识点
1.创建手动刷新的物化视图
需求:查询地址 ID,地址名称和所属区域名称, 结果如下:
语句
- create materialized view mv_address
- as
- select ad.id, ad.name adname, ar.name ar_name
- from t_address ad,t_area ar
- where ad.areaid=ar.id
复制代码 实行上边的语句后查询
查询结果如下:
这时,我们向地址表( T_ADDRESS)中插入一条新记载,
- insert into t_address values(8,'宏福苑小区',1,1);
复制代码 再次实行上边的语句举行查询,会发现新插入的语句并没有出现在物化视图中。
我们需要通过下面的语句(PL/SQL),手动刷新物化视图:
- begin
- dbms_mview.refresh('mv_address','C');
- end;
复制代码 2.创建字段刷新的物化视图,和上例一样的结果集
需求: 当 T_ADDRESS 表发生变化时,物化视图 主动跟着改变。
语句如下:
- create materialized view mv_address2
- refresh
- on commit
- as
- select ad.id,ad.name adname,ar.name ar_name
- from t_address ad, t_area ar
- where ad.areaid=ar.id
复制代码 3.创建时不天生数据的物化视图
- create materialized view mv_address3
- build deferred
- refresh
- on commit
- as
- select ad.id,ad.name adname,ar.name ar_name
- from t_address ad,t_area ar
- where ad.areaid=ar.id;
复制代码 创建后实行下列语句查询物化视图
- select * from mv_address3
复制代码 查询结果:
实行下列语句天生数据
- begin
- dbms_mview.refresh('MV_ADDRESS3','C');
- end;
复制代码 再次查询,得到结果:
由于我们创建时指定的 on commit ,所以在修改数据后能立刻看到最新数据,无须再次实行 refresh
4.创建增量刷新的物化视图
如果创建增量刷新的物化视图,必须起首创建物化视图日记
- create materialized view log on t_address with rowid;
- create materialized view log on t_area with rowid;
复制代码 创建的物化视图日记名称为 MLOG$_表名称
创建物化视图
- create materialized view mv_address4
- refresh fast
- as
- select ad.rowid adrowid, ar.rowid arrowid, ad.id,ad.name adname,ar.name ar_name
- from t_address ad, t_area ar
- where ad.areaid=ar.id;
复制代码 留意:创建增量刷新的物化视图,必须:
1. 创建物化视图中涉及表的物化视图日记。
2. 在查询语句中,必须包罗所有表的 rowid ( 以 rowid 方式建立物化视图日记 )
当我们向地址表插入数据后,物化视图日记的内容:
- insert into t_address values(11, '天通苑北4区', 4, 5)
复制代码
SNAPTIME$$:用于表现刷新时间。
DMLTYPE$$:用于表现 DML 操纵范例,I 表现 INSERT ,D 表现 DELETE ,U 表现 UPDATE。
OLD_NEW$$:用于表现这个值是新值还是旧值。 N(EW)表现新值,O( LD ) 表现旧值,U 表现 UPDATE 操纵。
CHANGE_VECTOR$$:表现修改矢量,用来表现被修改的是哪个或哪几个字段。
此列是 RAW 范例,其实 Oracle 采用的方式就是用每个 BIT 位去映射一个列。
插入操纵表现为:FE, 删除表现为:OO 更新操纵则根据更新字段的位置而表现不同的值。
当我们手动刷新物化视图后,物化视图日记被清空,物化视图更新。
- begin
- DBMS_MVIEW.refresh('MV_ADDRESS4','C');
- end;
复制代码 案例
- -- todo 1 增加物化视图日志
- drop materialized view log on T_ADDRESS;
- create materialized view log on T_ADDRESS with rowid;
- create materialized view log on T_AREA with rowid;
- -- todo 2 创建增量物化视图: 地址id 地址名称 区域名称
- create materialized view mv_addr_5
- refresh fast
- as
- select
- t1.ROWID as addr_rowid,
- t2.ROWID as area_rowid,
- t1.id,
- t1.name addr_name,
- t2.name area_name
- from T_ADDRESS t1, T_AREA t2
- where t1.AREAID=t2.id
- ;
- -- todo 3 添加一个新的地址
- insert into T_ADDRESS values(10, '天通苑4区', 2, 1);
- commit;
- delete from T_ADDRESS where id=8;
- delete from T_ADDRESS where id=9;
- commit;
- -- todo 4 查看日志
- -- todo 5 刷新
- begin
- DBMS_MVIEW.refresh('mv_addr_5','C');
- end;
- -- todo 6 验证
- select * from mv_addr_5;
复制代码 5.创建全量刷新的物化视图
- -- todo 1 创建全量物化视图: 统计每个区域的地址数量
- create materialized view mv_addr_7
- refresh
- on commit
- as
- select
- areaid,
- count(1) as cnt
- from t_address
- group by areaid
- ;
- -- todo 2 添加数据 测试
- insert into T_ADDRESS values(11, '天通苑5区', 2, 1);
- commit;
- -- 3 验证
- select * from mv_addr_6;
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |