实体化视图( materialized view )

相对于普通的视图来说,实体化视图的不同之处在于实体化视图管理存储数据,占据数据库的物理空间。实体化视图的结果会保存在一个普通的数据表中,在对实体化视图进行查询的时候不再会对创建实体化视图的基表进行查询,而是直接查询实体化视图对应的结果表,然后通过定期的刷新机制来更新MView表中的数据。

[refresh [fast | complete | force]
         [on demand | commit]
         [start with date]
         [next date]
         [with {primary key | rowid}]
       ]    

ON COMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:FAST、COMPLETE、FORCE和NEVE*。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND

1.创建的实体视图 不是自动刷新 而是需要手动去刷新

CREATE materialized VIEW "VB_table"

as select * from table;

 

exec dbms_mview.refresh( 'VB_table');

 

2.自动刷新视图

 主键物化视图
主键物化视图是默认的物化视图。在复制环境下,如果主键物化视图是作为物化视图组的一部分建立的,如果指定了FOR UPDATE语句,那么这个物化视图是可更新的,且这个物化视图组必须和主站点中复制组的同名。另外,可更新物化视图必须和主复制组在不同的数据库中。当修改发生后,修改的数据以行级为单位被传播,每行数据由主键确定。
主键物化视图可以包含一个子查询,因此你可以在建立物化视图时,建立所有数据的一个子集,也就是说,建立物化视图时可以只选取你需要的数据行。如果主站点中的主对象建立了物化视图日志表,那么一些包含特定类型子查询的主键物化视图仍然可以快速(增量)刷新。

SQL> create materialized view log on emp;
Materialized view log created.
SQL> create materialized view mv_emp_pk
  2  build deferred
  3  refresh fast
  4  start with sysdate
  5  next sysdate + 1/48
  6  with primary key
  7  as
  8  select * from emp;
Materialized view created.
SQL> select * from mv_emp_pk;
no rows selected

子查询物化视图
SQL>create materialized view m_test_view
as
select * from gwm_tabattribute a where exists (select * from gwm_attribute b where a.gwm_ano=b.gwm_ano);
生成数据有两大选项:
Build immediate:在创建物化视图的同时根据主表生成数据,默认选项
Bulid deferred:在创建物化视图的同时,在物化视图内不生成数据,如果此时没有生成数据,以后可以采取:EXEC DBMS_MVIEW.Refresh(‘MV_name’,’C’),注意必须使用全量刷新,默认是增量刷新,所以这里参数必须是C,因为之前都没有生成数据,所以必须全量。
刷新方式有:complete fast force
Complete:完全刷新整个物化视图,相当于重新生成物化视图,此时即时增量刷新可用也全量刷新
Fast:当有数据更新时依照相应的规则对物化视图进行更新,该选项必须在创建有物化视图日志的情况下才能使用。

Force:当增量刷新可用则增量刷新,当增量刷新不可用,则全量刷新(此项为默认选项)
不过从实际情况出发,应该尽量不使用默认选项,可以考虑使用增量刷新,对大表特别有效,大表全量更新速度是非常慢的,特别是在存在索引的情况下。在创建物化视图语句中,以下条件是所有类型的快速刷新物化视图都必须满足的条件:

1.物化视图不能包含对不重复表达式的引用,如SYSDATE和ROWNUM;

2.物化视图不能包含对LONG和LONG RAW数据类型的引用。

只包含连接的物化视图:

1.必须满足所有快速刷新物化视图都满足的条件;

2.不能包括GROUP BY语句或聚集操作;

3.如果在WHERE语句中包含外连接,那么唯一约束必须存在于连接中内表的连接列上;

4.如果不包含外连接,那么WHERE语句没有限制,如果包含外连接,那么WHERE语句中只能使用AND连接,并且只能使用“=”操作。

5.FROM语句列表中所有表的ROWID必须出现在SELECT语句的列表中。

6.FROM语句列表中的所有表必须建立基于ROWID类型的物化视图日志。

 

你可能感兴趣的:(ORACLE技术笔记)