Oracle普通视图和实体化视图比较(三)
4;
实体化视图已创建。
可以看已经成功创建,我们现在向表中插入数据来查看实体视图的变化情况
我们首先查询一下表中的记录和实体视图中的记录
SQL> select * from xjzhang_table4;
A B
---------- ----------
aaa 1
SQL> select * from xjzhang_mat_view1;
A B
---------- ----------
aaa 1
然后我们向表中插入 一条记录
SQL> insert into xjzhang_table4 values ('afd','00002');
已创建 1 行。
SQL> commit;
提交完成。
我们再来查询一下实体视图的内容
SQL> select * from xjzhang_mat_view1;
A B
---------- ----------
aaa 1
物化视图为什么没有变化
刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。ON COMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:FAST、COMPLETE、FORCE和NEVE*。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND
通过上面的这段话我们知道,刷新的类型 一般有两种:ON DEMAND 和 ON COMMIT
ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,这种方法也就是我们长说的使用手工刷新,而ON COMMIT也就是我们长说的 自动刷新,而刷新的方法有四种FAST、COMPLETE、FORCE和NEVER
我们选择的是FORCE 说明ORACLE 是有选择性的刷新,如果可以采用FAST,要不才用COMPLETE
我们采用手工刷新
EXECUTE DBMS_MVIEW.REFRESH('xjzhang_mat_view1','C');
C 代表 完全刷新
F 代表 快速刷新和强制刷新
SQL> select * from xjzhang_mat_view1;
A B
---------- ----------
aaa 1
SQL> EXECUTE DBMS_MVIEW.REFRESH('xjzhang_mat_view1','C');
PL/SQL 过程已成功完成。
SQL> select * from xjzhang_mat_view1;
A B
---------- ----------
aaa 1
afd 2
我们删除该实体视图
SQL> drop materialized view xjzhang_mat_view1;
实体化视图已删除。
然后我们重新创建实体视图采用 FAST 方法
SQL> create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4;
create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4
*
第 1 行出现错误: ORA-23413: 表 "SYS"."XJZHANG_TABLE4" 不带实体化视图日志
错误提示需要带实体化视图日志
我们来创建实体化视图日志
SQL> create materialized view log on xjzhang_table4 with rowid, sequence (a, b) including new values;
实体化视图日志已创建。
然后我们再次创建实体视图 FAST 方法
SQL> create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4;
create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4
*
第 1 行出现错误: ORA-23415: "SYS"."XJZHANG_TABLE4" 的实体化视图日志不记录主键
又提示错误,根据提示错误我们主键失效
SQL> alter table xjzhang_table4 modify constraint xjzhang_pri disable;
表已更改。
然后我们再次创建物化视图 FAST
SQL> create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4;
create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4
*
第 1 行出现错误: ORA-12014: 表 'XJZHANG_TABLE4' 不包含主键约束条件
这次
系统又提示不包含主键约束条件,我们删除实体视图对应的日志
SQL> DROP MATERIALIZED VIEW LOG ON xjzhang_table4;
实体化视图日志已删除。
我们在创建实体视图日志的时候设定主键
SQL> create MATERIALIZED VIEW LOG ON xjzhang_table4 WITH PRIMARY KEY; 实体化视图日志已创建。
然后我们再次创建实体视图
SQL> create materialized view xjzhang_mat_view1 refresh fast on commit as select * from xjzhang_table4;
实体化视图已创建。
可以看出创建成功,如果需要自动更新的话,我们需要创建一个自动执行的 JOB。