完全刷新物化视图对主键依赖

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值