Materialized View

物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对总体查询性能的提升,并无实质上的好。
    物化视图:是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表。物化视图存储基于远程表的数据,也能够称为快照!数据库

特色:oracle

(1) 物化视图在某种意义上说就是一个物理表(并且不单单是一个物理表),这经过其能够被user_tables查询出来,而获得确认;函数

(2) 物化视图也是一种段(segment),因此其有本身的物理存储属性;性能

(3) 物化视图会占用数据库磁盘空间,这点从user_segment的查询结果,能够获得佐证;ui

建立语句:create materialized view mv_name as select * from table_namespa

由于物化视图因为是物理真实存在的,故能够建立索引。日志

建立时生成数据:索引

分为两种:build immediate 和 build deferred,事务

build immediate是在建立物化视图的时候就生成数据。it

build deferred则在建立时不生成数据,之后根据须要在生成数据。

若是不指定,则默认为build immediate。

 

刷新模式:

物化视图有二种刷新模式:

在建立时refresh mode是 on demand 仍是 on commit。

on demand 顾名思义,仅在该物化视图“须要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;

on commit  提交触发,一旦基表有了commit,即事务提交,则马上刷新,马上更新物化视图,使得数据和基表一致。通常用这种方法在操做基表时速度会比较慢。

建立物化视图时未做指定,则Oracle按 on demand 模式来建立。

 

上面说的是刷新的模式,针对于如何刷新,则有三种刷新方法:

 

彻底刷新(COMPLETE): 会删除表中全部的记录(若是是单表刷新,可能会采用TRUNCATE的方式),而后根据物化视图中查询语句的定义从新生成物化视图。

快速刷新(FAST): 采用增量刷新的机制,只将自上次刷新之后对基表进行的全部操做刷新到物化视图中去。FAST必须建立基于主表的视图日志。对于增量刷新选项,若是在子查询中存在分析函数,则物化视图不起做用。

FORCE方式:这是默认的数据刷新方式。Oracle会自动判断是否知足快速刷新的条件,若是知足则进行快速刷新,不然进行彻底刷新。

 

关于快速刷新:Oracle物化视图的快速刷新机制是经过物化视图日志完成的。Oracle经过一个物化视图日志还能够支持多个物化视图的快速刷新。物化视图日志根据不一样物化视图的快速刷新的须要,能够创建为ROWID或PRIMARY KEY类型的。还能够选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

 

查询重写(QueryRewrite):

包括 enable query rewrite 和 disable query rewrite 两种。

分别指出建立的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,oracle会自动判断可否经过查询物化视图来获得结果,若是能够,则避免了汇集或链接操做,而直接从已经计算好的物化视图中读取数据。

默认为disable query rewrite。

 

语法:

create materialized view view_name
refresh [fast|complete|force]
[
on [commit|demand] |
start with (start_time) next (next_time)

]

AS subquery;

 

具体操做

 

建立物化视图须要的权限:

grant create materialized view to user_name; 

 

在源表创建物化视图日志:

create materialized view log on test_table  

tablespace test_space -- 日志空间  

with primary key;     -- 指定为主键类型

 

在目标数据库上建立MATERIALIZED VIEW:

create materialized view mv_materialized_test refresh force on demand start with sysdate next

to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),'10:25:00'),'dd-mm-yyyy hh24:mi:ss') as

select * from user_info; --这个物化视图在天天10:25进行刷新 

 

修改刷新时间:

alter materialized view mv_materialized_test refresh force on demand start with sysdate 

next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 23:00:00'),'dd-mm-yyyy hh24:mi:ss');

alter materialized view mv_materialized_test refresh force on demand start with sysdate 

next trunc(sysdate,'dd')+1+1/24; -- 天天1点刷新 

 

创建索引:

create index IDX_MMT_IU_TEST

on mv_materialized_test(ID,UNAME)  

tablespace test_space; 

 

删除物化视图及日志:

drop materialized view log on test_table;    --删除物化视图日志: 

drop materialized view mv_materialized_test; --删除物化视图
相关文章
相关标签/搜索