Oracle 物化视图

什么是物化视图、物化视图日志.

物化视图的刷新模式、刷新方法

物化视图

   1、物化视图是已存储查询结果集的数据库对象.

   2、物化视图可以基于表、视图、物化视图创建.

  

   3、物化视图是一种特殊的物理表,物化视图是相对普通视图而言的,

      普通视图是虚拟表.

                  

物化视图的特点

         1、物化视图包含真实的数据而且占用数据库中的存储空间.

         2、当master tables中的数据发生改变,物化视图中的数据可以刷新与master tables中数据保持一致.

         3、当使用查询重写操作时可以提高查询语句的执行性能.

  

创建最简单的物化视图

创建物化视图必须拥有CREATE MATERIALIZED VIEW的系统权限

SQL> CREATE MATERIALIZED VIEW MV_EMP AS SELECT * FROM SCOTT.EMP;

Materialized view created.

SQL> select object_name,object_type,status from user_objects where object_name='MV_EMP';

OBJECT_NAME  OBJECT_TYPE         STATUS

--------------------------------------------------------------------------------

MV_EMP       TABLE               VALID

MV_EMP      MATERIALIZED VIEW   VALID

SQL> select segment_name,segment_type,tablespace_name,bytes,blocks from user_segments where segment_name='MV_EMP';

SEGMENT_NAME  SEGMENT_TYPE  TABLESPACE_NAME     BYTES     BLOCKS

----------------------------------------------------------------

MV_EMP        TABLE         USERS               65536         8

SQL> select owner,mview_name,rewrite_enabled,refresh_mode,refresh_method,build_mode,compile_state from user_mviews;

OWNER      MVIEW_NAME   REWRITE_ENABLED REFRESH_MODE REFRESH_METHOD    BUILD_MODE COMPILE_STATE

------------------------------------------------------------------------------------------------

SCOTT      MV_EMP       N               DEMAND       FORCE             IMMEDIATE  VALID

创建物化视图时如果没指定创建方式、刷新模式和刷新方法,则Oracle默认的创建方式为BUILD IMMEDIATE

,默认的刷新模式为ON DEMAND,默认的刷新方法为REFRESH FORCE.

BUILD IMMEDIATE表示在创建物化视图的时候就生成数据,默认方式

BUILD DEFERRED表示在创建物化视图时不生成数据,以后根据需要再生成数据

刷新模式

物化视图有2种刷新模式:ON DEMAND和ON COMMIT, ON DEMAND是默认的刷新模式

ON DEMAND表示物化视图“需要”被刷新时才更新,通过手工执行DBMS_MVIEW包中的存储过程或

者创建oracle的job来调用相同的存储过程实现物化视图的刷新.使用ON DEMAND可以定义START

WITH语句和NEXT语句,START WITH设定物化视图第一次执行自动刷新的时间,NEXT设定物化视图

自动刷新的时间间隔.

ON COMMIT表示一旦基表有事务提交则立即更新物化视图,ON COMMIT模式增加了事务提交完成需

要的时间,因为数据库将执行物化视图的刷新作为事务处理的一部分.使用ON COMMIT不能定义

START WITH和NEXT语句,不支持通过dblink创建在remote table的物化视图,否则会报

ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

ON DEMAND和ON COMMIT的区别:前者不刷新(手工或自动)就不更新物化视图,而后者只要基表发

生了事务提交就会更新物化视图.

物化视图共有3种刷新方法:

1、FAST 只刷新自上次刷新以后master table中进行的修改,必须在master table定义物化视图日志,物化视图日志记录master table进行的修改,使物化视图可以实现增量刷新.

2、COMPLETE 对整个物化视图进行重定义查询.

3、FORCE 刷新时判断是否可以进行fast refresh,如果可以则进行fast refresh,否则进行complete refresh, force refresh是默认的刷新方法.

物化视图的查询重写

查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以则避免了对基表的聚集或连接操作,直接从物化视图中读取数据对查询进行快速的响应.

查询重写(Query Rewrite)包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE

ENABLE QUERY REWRITE表示创建的物化视图持查询重写

DISABLE QUERY REWRITE表示创建的物化视图不支持查询重写

默认为DISABLE QUERY REWRITE

如果创建的物化视图启用了查询重写,必须使用DBMS_STATS包收集物化视图的统计信息,数据库需要使用收集到的统计信息优化查询重写.

创建物化视图的AS子查询语句

当创建物化视图时,数据库执行子查询语句并将查询的结果集存放在物化视图中, 这个子查询语句可以是任何合法的select语句,但不是所有的都支持fast refresh,不是所有的都支持query rewrite.

对物化视图子查询语句的一些注意事项:

1、创建物化视图时如果指定BUILD DEFERRED,数据库不会立即执行查询语句

2、Oracle建议子查询语句中FROM clause中引用的每个表和视图都包含这些对象所属的用户

子查询语句的一些限制:

1、子查询语句中可以使用SYS用户的表、视图和物化视图,但是创建的物化视图不允许启用QUERY REWRITE

2、子查询语句中不能使用闪回查询的AS OF语句

3、带有GROUP BY语句的materialized join views and materialized aggregate views不能从index-organized的表中查询

4、不能包含LONG或者LONG RAW类型的columns

5、不能包含virtual columns

6、不能使用临时表

原文地址:https://www.cnblogs.com/houguiqiang/p/3320909.html