有PUBER在论坛上提出了这个问题,于是简单测试了一下。
其实一直以来对于完全刷新的物化视图关注不多,因为这种物化视图的刷新代价太大,对于绝大部分情况没有多大的意义,尤其是ON COMMIT方式的完全刷新物化视图,除非是表中的记录很少,否则就是人为的给系统造成性能问题。
SQL> create table test (id number, name varchar2(30));
表已创建。
SQL> insert into test select rownum, tname from tab;
已创建25行。
SQL> commit;
提交完成。
SQL> create materialized view mv_t
2 refresh complete
3 as select *
4 from test;
实体化视图已创建。
SQL> drop materialized view mv_t;
实体化视图已删除。
SQL> create materialized view mv_t
2 refresh complete on commit
3 as select *
4 from test;
from test
*
第 4 行出现错误:
ORA-12054: 无法为实体化视图设置 ON COMMIT 刷新属性
SQL> alter table test add primary key (id);
表已更改。
SQL> create materialized view mv_t
2 refresh complete on commit
3 as select *
4 from test;
实体化视图已创建。
SQL> delete test where id = 1;
已删除 1 行。
SQL> commit;
提交完成。
SQL> exec dbms_mview.refresh('MV_T')
PL/SQL 过程已成功完成。
SQL> select mview_name, refresh_mode, refresh_method, last_refresh_type
2 from user_mviews
3 where mview_name = 'MV_T';
MVIEW_NAME REFRES REFRESH_ LAST_REF
------------------------------ ------ -------- --------
MV_T COMMIT COMPLETE COMPLETE
SQL> select table_name, index_name
2 from user_indexes
3 where table_name = 'MV_T';
TABLE_NAME INDEX_NAME
------------------------------ ------------------------------
MV_T SYS_C0011335
SQL> drop materialized view mv_t;
实体化视图已删除。
SQL> alter table test drop primary key;
表已更改。
SQL> create materialized view mv_t
2 refresh complete with rowid on commit
3 as select *
4 from test;
实体化视图已创建。
从上面的例子可以看出,对于不指定ON COMMIT的完全刷新而言,是不需要主键的,而一旦指定了ON COMMIT语句,则Oracle要求基表必须包括主键,否则就会出现ORA-12054错误,加上主键后,物化视图可以创建成功,且创建成功后的物化视图也会自动包括主键。
其实这个主键限制也是可以避免的,就是在指定完全刷新的时候在指定WITH ROWID方式,这样建立的ON COMMIT的完全刷新物化视图不再要求基表具有主键。
至于这个主键是否必要,个人感觉意义不大,很可能是FAST ON COMMIT的限制条件,而在COMPLETE ON COMMIT时没有放宽,估计COMPLETE ON COMMIT方式很少有人使用,因此这个问题也基本上没人会碰到。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-677008/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-677008/