物化视图简介
物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限大,任何对视图的查询,Oracle实际上都是转换为视图SQL语句的查询,对于整体查询性能的提高,并没有实质上的好处。物化视图主要用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果。使用物化视图的目的是为了提高查询性能;物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性。
物化视图的特点:
1、 物化视图在某种意义上就是一个物理表(而且不仅仅是一个物理表),可以通过user_tables查询出来;
2、 物化视图也是一种段(segment),所以其有自己的物理存储属性;
3、 物化视图会占用数据库磁盘空间。
创建物化视图的语法如下:
create materialized view my_view_name
build [immediate|deferred] --1.创建方式
refresh [complete|fast|force|never] --2.物化视图刷新方式
on [commit|demand] --3.刷新触发方式
start with (start_date) --4.开始时间
next (interval_date) --5.间隔时间
with [primary key|rowid] --默认 primary key
enable query rewrite --7.是否启用查询重写(enable/disable)
as --8.关键字
select statement; --9.基表选取数据的select语句
其中:
1.创建方式默认是immediate,立即,在创建物化视图的时候就生成数据;deferred,延迟,在创建时不生成数据,以后根据需要再生成数据。
2.物化视图刷新方式默认为force,意思是:如果可以快速刷新,就执行快速刷新;否则,执行完全刷新。
complete,完全刷新,即,刷新时更新全部数据,包括视图中已经生成的原有数据。
fast,快速刷新,只刷新增量部分。前提是,需要在基表上创建物化视图日志。该日志记录基表数据变化情况,所以才能实现增量刷新。
never,从不刷新。
3.on commit,基表有commit动作时即事务提交,则立刻刷新物化视图;on demand,在需要时刷新,即,根据后面设定的起始时间和时间间隔进行刷新,或者,手动调用dbms_mview包中的过程刷新时再执行刷新,以保证物化视图中的数据和基表一致。
4和5.即开始刷新时间和下次刷新的时间间隔。如:start with sysdate next sysdate+1/1440表示马上开始,刷新间隔为1分钟。(与 on commit选项冲突)
6.基于基表的主键或者rowid创建。如果是基于rowid,不能对基表执行分组函数、多表连结等需要把多个rowid合成一行的操作(理由很简单:不合并的话到底以哪个rowid为准)。
7.如果设置了初始化参数query_rewrite_enabled=true则默认就会启用查询重写。但是,数据库默认该参数为false。并且,不是什么时候都应该启用查询重写。所以,该参数应该设置为false,而在创建特定物化视图时,根据需要开启该功能。另外,如果选择使用了上面第4‘5选项,则不支持查询重写功能(原因很简单,所谓重写,就是将对基表的查询定位到了物化视图上,而4、5选项会造成物化视图上部分数据延迟,所以,不能重写)。
查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE。
创建物化视图实例
创建增量刷新的物化视图时应该先创建存储的日志空间,对象是emp表;
SQL> select * from emp
2 ;
EMPNO SAL COMM SAL_PACK
------- --------- --------- ----------
10 100 100 200
20 100 100 200
30 100 0 100
SQL> create materialized view log on emp with rowid ;
Materialized view log created
然后创建物化视图:
SQL> create materialized view emp_mv
2 build immediate --创建视图时即时生成数据
3 refresh fast --基于增量刷新
4 on commit --数据DML操作提交就刷新,选择commit就无需指定start/next date
5 with rowid --基于ROWID刷新
6 as select * from emp;
Materialized view created
SQL> select * from emp_mv;
EMPNO SAL COMM SAL_PACK
------- --------- --------- ---------
10 100 100 200
20 100 100 200
30 100 0 100
SQL> create materialized view emp_mvss
2 build deferred --延迟刷新,创建视图时不生成数据
3 refresh force --如果可以快速刷新则进行快速刷新,否则完全刷新
4 on demand --需要时刷新,与start/next date相配合
5 start with sysdate --第一次刷新时间
6 next sysdate+2 --每隔两天刷新一次
7 with rowid --基于ROWID刷新
8 as select * from emp;
Materialized view created
SQL> select * from emp_mvss;
EMPNO SAL COMM SAL_PACK
------- --------- --------- ---------
删除物化视图日志:
SQL> drop materialized view log on emp;
Materialized view log dropped
删除物化视图:
SQL> drop materialized view emp_mv;
Materialized view dropped