物化视图 materialized view

一、物化视图作用

1)起源于数据仓库,早先用于预先计算,并保存表连接表聚集等耗时较多操作的结果。以便于在执行查询时,避免在基表上进行这些耗时的操作(基表上进行耗时操作是不是会影响其他用户使用这个基表的效率,毕竟基表查询肯定很频繁?或者单纯从Oracle性能角度出发,希望利用物化视图减少基表非常耗时的操作,从而提升数据库性能?),从而快速得到结果。

2)物化视图和表一样可以进行查询。物化视图还用于复制移动计算等方面。

二、物化视图创建时的权限问题

基于主键的物化视图:访问主表,访问主表的日志,create materialized view权限

基于rowid的物化视图:访问主表,create materialized view权限

三、创建物化视图语法

create materialized view [view_name]

refresh [fast|complete|force]

[

on [commit|demand]  |

start with (start_time) next (next_time)

]

as

{创建物化视图时用的查询语句}

四、物化视图创建时选项

4.1查询重写 query rewrite

查询重写指当对物化视图的基表进行查询时,Oracle会先判断是否可以通过查询物化视图直接得到结果。默认为disable query rewrite

4.2物化视图日志

在基于主键的物化视图上,当需要进行快速刷新时,需要建立物化视图日志。

4.3刷新

指当基表发生DML操作后,物化视图以哪种方式和基表进行同步。

刷新模式有2种:

  • on demand    用户在需要时进行刷新,刷新时间由用户定义
  • on commit
  • failed immediate

刷新方法有4种:

  • fast           一种增量刷新,在上次刷新的基础上,对此次在基表做的DML修改进行刷新。只刷                   新上次刷新以后做的修改
  • complete  完全刷新。是对整个物化视图进行的刷新
  • force         oracle在刷新时会判断是否可以采用fast刷新,如果不可以会采用complete刷新                 (肯定会刷新。若上次刷新之后的操作丢失,无法做fast刷新,于是做全表刷新)
  • nerver       物化视图不做任何刷新。

刷新默认值是force on demand

五、实践

1.查看所有的物化视图

SQL> select * from user_mviews;

no rows selected

2.手动刷新物化视图

BEGIN
DBMS_MVIEW.REFRESH (
list => 'MV_T_HR_BMXX_NIRC',
Method =>'COMPLETE',
refresh_after_errors => True);
end;

其中MV_T_HR_BMXX_NIRC是物化视图的名称

3.创建数据量非常大的表

SQL> conn / as sysdba;
Connected.
SQL> create table scott.test082601 as select * from dba_objects;

Table created.

SQL> conn scott/scott;
Connected.
SQL> select count(*) from test082601;

  COUNT(*)
----------
     79318

创建约束和基表创建物化视图日志

alter table test082601 add constraint test_pk_pid primary key(OBJECT_ID);

create materialized view log on test082601 with primary key;

创建下面的物化视图

 create materialized view mv01 build immediate refresh force on demand as select * from test082601;

create materialized view mv build immediate refresh fast on demand as select * from test082601;

create materialized view mv build immediate refresh complete on demand as select * from test082601;

向基表中插入数据

测试:

insert into test082601(object_id,object_name) values(120000,'this is a test')

插入

begin

for i in 100001..110000 loop

insert into test082601(object_id,object_name) values(i,'this is a test');

end loop;

end;

/

对三个表分别做全刷新,增量刷新

升级至19.11

查看是否失效;

查看刷新是否可行;

六、检测升级对物化视图的影响

问题描述:

即使对物化视图做增量刷新,在升级后物化视图内容是否会丢失

不对物化视图做刷新,在升级后查看物化视图是否失效

对物化视图做刷新,查看升级后物化视图是否失效

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值