Oracle的实体化视图提供了强大的功能,能够用在不一样的环境中,实体化视图和表同样能够直接进行查询。实体化视图能够基于分区表,实体化视图自己也能够分区sql

主要用于预先计算并保存表链接或汇集等耗时较多的操做的结果,这样,在执行查询时,就能够避免进行这些耗时的操做,而从快速的获得结果。在数据仓库中,还常常使用查询重写(query rewrite)机制,这样不须要修改原有的查询语句,Oracle会自动选择合适的实体化视图进行查询,彻底对应用透明。实体化视图和表同样能够直接进行查询。post

实体化视图还用于复制、移动计算,远程同步等方面。性能

实体化视图有不少方面和索引很类似:使用实体化视图的目的是为了提升查询性能;实体化视图对应用透明,增长和删除实体化视图不会影响应用程序中SQL语句的正确性和有效性;实体化视图须要占用存储空间;当基表发生变化时,实体化视图也应当刷新。 
materialized view 同snapshot是同一个概念。但同view是不同的: 
   1)物化视图是存储数据的视图,存储了基础表的所有或者一部分数据,主要用做sql语句的优化,查询物化视图比查询表中的数据速度要快; 
   2)MV是自动刷新或者手动刷新的,View不用刷新; 
   3) MV也能够直接update,可是不影响base table,对View的update反映到base table上; 
   4)MV主要用于远程数据访问,mv中的数据须要占用磁盘空间,view中不保存数据 优化

 

使用语法:spa

CREATE MATERIALIZED VIEW XXblog

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

      [ENABLE | DISABLE] QUERY REWRITE同步

  Refresh 刷新子句 
   描述 当基表发生了DML操做后,实体化视图什么时候采用哪一种方式和基表进行同步 
   取值 FAST 采用增量刷新,只刷新自上次刷新之后进行的修改 
    COMPLETE 对整个实体化视图进行彻底的刷新 
    FORCE(默认) Oracle在刷新时会去判断是否能够进行快速刷新,若是能够则采用Fast方式,不然采用Complete的方式,Force选项是默认选项 
   ON DEMAND(默认) 实体化视图在用户须要的时候进行刷新,能够手工经过      DBMS_MVIEW.REFRESH等方法来进行刷新,也能够经过JOB定时进行刷新 
ON COMMIT 实体化视图在对基表的DML操做提交的同时进行刷新 

    START WITH 第一次刷新时间 
    NEXT 刷新时间间隔 
    WITH PRIMARY KEY(默认) 生成主键实体化视图,也就是说实体化视图是基于表的主键,而不是ROWID(对应于ROWID子句)。 为了生成PRIMARY KEY子句,应该在表上定义主键,不然应该用基于ROWID的实体化视图。主键实体化视图容许识别实体化视图表而不影响实体化视图增量刷新的可用性 
it

 

REWRITE 字句table

包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。

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

 

例子:

首先建立表

 

CREATE TABLE my_tables AS
SELECT DBA_TABLES.* FROM DBA_TABLES;

CREATE TABLE my_indexes AS
SELECT DBA_INDEXES.*
  FROM DBA_TABLES, DBA_INDEXES
 WHERE DBA_TABLES.OWNER = DBA_INDEXES.table_owner
   AND DBA_TABLES.TABLE_NAME = DBA_INDEXES.table_name

建立簇

CREATE CLUSTER my_cluster(index_type VARCHAR2 (30))

SIZE 8192 HASHKEYS 5;

建立MV

CREATE MATERIALIZED VIEW my_mvCLUSTER my_cluster(index_type)REFRESH FAST ON COMMITENABLE QUERY REWRITEAS  SELECT t.ROWID AS table_rowid,  t.owner AS table_owner,  t.tablespace_name,  i.rowId AS index_rowId,  i.index_type  FROM my_tables t,  my_indexes i  WHERE t.owner = i.table_owner    AND t.table_name = i.table_name;