Oracle普通视图和实体化视图比较(二)
。
下面我们更新一下XJZHANG_TABLE3 表中的信息,看一下 实体视图的变化信息
SQL> insert into xjzhang_table3 values ('ccc','00003');
已创建 1 行。
SQL> commit;
提交完成。
查询该表的信息
SQL> select * from xjzhang_table3;
A B
---------- ----------
aaa 1
bbb 2
ccc 3
表的记录增加了一行
我们再来查询实体视图的信息
SQL> select * from xjzhang_mat_view;
A B
---------- ----------
aaa 1
bbb 2
可以看出实体视图的信息没有发生变化,因为我们在创建实体视图的时候,我们没有指定该视图的刷新方法和刷新模式,所以创建完该实体视图,该视图默认的刷新方法和刷新模式为 FORCE DEMAND
我们可以通过 dba_mviews 这个视图查询我们创建的实体视图的信息
SQL> select a.mview_name,a.refresh_mode,a.refresh_method from dba_mviews a where a.mview_name='XJZHANG_MAT_VIEW';
MVIEW_NAME REFRESH_MODE REFRESH_METHOD
------------------------------ -------------- --------------
XJZHANG_MAT_VIEW DEMAND FORCE
这里默认的是手工刷新,所以在这里我们对实体视图进行更新
SQL> EXEC DBMS_MVIEW.REFRESH('XJZHANG_MAT_VIEW')
PL/SQL 过程已成功完成。
然后我们再次查询该实体视图
SQL> SELECT * FROM XJZHANG_MAT_VIEW;
A B
---------- ----------
aaa 1
bbb 2
ccc 3
这说明了基表的数据发生变化,那么实体视图的内容也将被写入到对应的存储空间中。
我们也可以创建自动更新的实体视图,同样我们创建一张表
SQL> create table xjzhang_table4 (a varchar2(10),b number(5));
表已创建。
SQL> insert into xjzhang_table4 values ('aaa','00001');
已创建 1 行。
SQL> commit;
提交完成。
然后我们创建实体视图
SQL> create materialized view xjzhang_mat_view1 refresh force on commit as select * from xjzhang_table4;
create materialized view xjzhang_mat_view1 refresh force on commit as select * from xjzhang_table4
*
第 1 行出现错误: ORA-12054: 无法为实体化视图设置 ON COMMIT 刷新属性
物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新。因此快速刷新是物化视图刷新方式的首选。但是快速刷新具有较多的约束,而且对于采用ON COMMIT模式进行快速刷新的物化视图更是如此。对于包含聚集和包含连接的物化视图的快速刷新机制并不相同,而且对于多层嵌套的物化视图的快速刷新更是有额外的要求。如此多的限制一般很难记全,当建立物化视图失败时,
Oracle给出的错误信息又过于简单,有时无法使你准确定位到问题的原因。Oracle提供的DBMS_MVIEW.EXPLAIN_MVIEW过程可以帮助你快速定位问题的原因。
Oracle提供的DBMS_MVIEW.EXPLAIN_MVIEW过程可以帮助你快速定位问题的原因,我们来试一下ORACLE 提供的包.
使用EXPLAIN_MVIEW过程首先要建立MV_CAPABILITIES_TABLE表
创建步骤如下
我们执行一个脚本来完成创建
SQL> @ /RDBMS/ADMIN/utlxmv.sql
表已创建。
然后我们执行这个包
SQL> begin
2 dbms_mview.explain_mview('select * from xjzhang_table4');
3 end;
4
/
PL/SQL 过程已成功完成。
然后我们通过 select capability_name, possible, msgtxt from mv_capabilities_table where capability_name like 'REFRESH%'这个脚本来查询结果
SQL> select capability_name, possible, msgtxt from mv_capabilities_table 2 where capability_name like 'REFRESH%'; CAPABILITY_NAME P MSGTXT
------------------------------ - ------------------------------ REFRESH_COMPLETE N 主表中没有任何主键约束条件 REFRESH_FAST N
REFRESH_FAST_AFTER_INSERT N 详细信息表没有实体化视图日志
REFRESH_FAST_AFTER_ONETAB_DML N 查看禁用 REFRESH_FAST_AFTER_IN SERT 的原因
REFRESH_FAST_AFTER_ANY_DML N 查看禁用 REFRESH_FAST_AFTER_ON ETAB_DML 的原因 REFRESH_FAST_PCT N PCT 不可能在实体化视图中的任何从表上
已选择6行。
我们可以看到第一条
REFRESH_COMPLETE N 主表中没有任何主键约束条件
我们给 xjzhang_table4 创建主键
SQL> alter table xjzhang_table4 add (constraint xjzhang_pri primary key (b));
表已更改。
然后我们再次创建实体视图
SQL> create materialized view xjzhang_mat_view1 refresh force on commit as select * from xjzhang_table