ORACLE物化视图依赖表结构变化影响测试
1.ORACLE物化视图
1.1 基本定义
Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也可以称为快照。
1.2 特点
(1) 物化视图在某种意义上说就是一个物理表(而且不仅仅是一个物理表),可以从user_tables查询;
(2) 物化视图也是一种段(segment),所以其有自己的物理存储属性;
(3) 物化视图会占用数据库磁盘空间,可以从user_segment查询;
创建语句:create materialized view mv_name as select * from table_name
1.3 视图类型
on command(默认模式)
仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;
on commit
提交触发,一旦基表有了commit,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。一般用这种方法在操作基表时速度会比较慢。
1.4 刷新方法
完全刷新(COMPLETE)
会删除表中所有的记录(如果是单表刷新,可能会采用TRUNCATE的方式),然后根据物化视图中查询语句的定义重新生成物化视图。
快速刷新(FAST)
采用增量刷新的机制,只将自上次刷新以后对基表进行的所有操作刷新到物化视图中去。FAST必须创建基于主表的视图日志。对于增量刷新选项,如果在子查询中存在分析函数,则物化视图不起作用。
物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
FORCE(默认)
这是默认的数据刷新方式。Oracle会自动判断是否满足快速刷新的条件,如果满足则进行快速刷新,否则进行完全刷新。
参考链接:Oracle物化视图的一般使用
2.依赖表结构变化影响测试
测试环境:
操作系统:ORACLE LINUX 5.8
数据库版本:11.2.0.4.0 单实例
2.1 测试准备
--创建测试表
create table TAB_AS_MV as select owner,object_name,object_type from dba_objects where rownum<100;
--创建物化视图,依赖前面创建的表TAB_AS_MV
create MATERIALIZED VIEW MV_TEST
refresh force on demand
as select * from TAB_AS_MV;
--手动刷新物化视图
begin
dbms_mview.refresh('MV_TEST');
end;
执行截图如下:
2.2 修改结构
--改变测试表字段长度
alter table TAB_AS_MV modify (OBJECT_TYPE VARCHAR(25));
--往测试表插入数据
insert into TAB_AS_MV (OWNER,OBJECT_NAME,OBJECT_TYPE) values('TEST','TESTTEST','INDEXINDEXINDEXINDEXINDEX');
commit;
--查询数据确认已插入成功
col owner for a20
col object_name for a10
col object_type for a50
select * from TAB_AS_MV where object_type='INDEXINDEXINDEXINDEXINDEX';
2.3 刷新视图
begin
dbms_mview.refresh('MV_TEST');
end;
出现ORA-12899: value too large for column"XXX".“MV_TEST”.“OBJECT_TYPE” (actual:25, maximum: 19)
2.4 测试结论
ORACLE物化视图依赖表的表结构发生变化后,与物化视图同名的表的表结构不会发生变化