什么是物化视图、物化视图日志.
物化视图的刷新模式、刷新方法
物化视图
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、不能使用临时表