普通视图:本身没有数据,数据来源于基表,不占用空间 (DBA_views)
物化视图:有自己的数据,占用空间
物化视图的优点是性能好(不用再去执行建立视图的子查询),缺点是占用物理空间
1、创建物化视图
eg:
create materialized view mv_1
as
select d.dname ,sum(e.sal) sum_sal,avg(e.sal) avg_sal
from emp e,dept d
where e.deptno=d.deptno
group by d.dname;
2、刷新物化视图
1)手动刷新:
刷新指定的物化视图: DBMS_MVIEW.REFRESH('MV_1',parallelish=>10);
刷新基于某个基表的物化视图:DBMS_MVIEW.REFRESH_DEPENDENT('EMP');
刷新所有物化视图:DBMS_MVIEW.REFRESH_ALL_MVIEWS;
2)快速刷新:
创建一个表:create table t as select * from emp;
给表上创建物化视图日志:
create materialized view log on t
with rowid,sequence (empno,ename,sal)
including new values
创建快速刷新的物化视图:
create materialized view mv_3
refresh fast on commit
as select empno,ename,count(*) from t
group by empno,ename
---------------------------------------------
后来我又试了一下,不用建立物化视图日志就可以“快速刷新”的~!!
实验步骤:
①建立一个表:create table t as select * from emp;
②给表加上主键:alter table t add constraint pk_t primary key(empno); ---没有主键不能
③建立
create materialized view mv_1
refresh (force) on commit
as
select * from t
④测试:t表更新后commit,物化视图mv_1也更新了
3、查询重写
查询重写就是把访问基表的查询改写为访问物化视图,从而提高查询速度
这样一来的话,你的程序可以在不改写的情况下提高性能
建立物化视图时加入关键字:ENABLE QUERY REWRITE