(一)什么是物化视图
视图是一张虚拟表( 也可以认为是一条语句 ),基于创建是指定的查询语句返回的结果集,每次访问他都会导致这个查询语句被执行一次 。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图( 也叫实体化视图 )。
物化视图与普通的视图相比的区别是物化视图是建立的副本,他类似于一张表 ,需要占用存储空间 ,而对一个物化视图查询的执行效率与查询一个表是一样 。
(二)创建物化视图语法
CREATE METERIALIZED VIEW view_name
[ BUILD IMMEDIATE | BUILD DEFERRED][
ON [ COMMIT |DEMAND ] | START WITH (start_time) NEXT
(next_time)]
ASsubquery
注释:
BUILD IMMEDIATE 是在创建物化视图的时候就生成数据
BUILD DEFERRED 则在创建不生成数据,以后根据需要再生成数据。默认为 BUILD IMMEDIATE。
刷新(REFRESH):指当基表发生了DML操作后 ,物化视图何时采用哪种方式和基表进行同步 。
REFRESH 后跟着指定的刷新方法有三总 :FAST、COMPLETE、FORECE 。
FAST 刷新采用增量刷新 ,只刷新自上次刷新以后进行的修改 。
COMPLETE 刷新对整个物化视图进行完全的刷新 。
FORCE 刷新方式 ,则Oracle在刷新时会去判断是否可以进行快速刷新 ,如果可以则采用FAST 方式 ,否则采用 COMPLETE 的方式 。
刷新的模式有两种 :ON DEMAND 和 ON COMMIT 。ON DEMAND 指需要手动刷新物化视图( 默认 )。ON COMMIT 指在基表发生 COMMIT 操作时自动刷新 。
1.创建手动刷新的物化视图
需求 :查询地址ID ,地址名称及所属区域名称 ,结果如下 :
语句 :
create materialized view mv_address
as
select ad.id,ad.name adname,ar.name ar_name
from t_address ad,t_area ar
where ad.areaid=ar.id
执行上边的语句后查询
select * from mv_address
查询结果如下 :
这时 ,我们向地址表( t_address )中插入一条新纪录 ,
insert into t_address values(8,'宏福苑小区',1,1) ;
再次执行上边的语句进行查询 ,会发现新插入的语句并没有出现在物化视图中 。
我们需要通过下面的语句( PL/SQL),手动刷新物化视图 :
begin
DBMS_MVIEW.refresh('MV_ADDRESS','C')
或者通过下面的命令手动刷新物化视图 :
EXEC DBMS_MVIEW.refresh('MV_ADDRESS','C')
执行此命令后再次查询物化视图 ,就可以查询到最新的数据了。
2.创建自动刷新的物化视图 ,和上例一样的结果集
语句如下 :
create materialized view mv_address
refresh
on commit
as
select ad.id,ad.name adname,ar.name ar_name
from t_address ad,t_area ar
where ad.areaid=ar.id
创建此物化视图后 ,当T_address表发生变化时 ,mv_address自动跟着改变 。
3.创建时不生成数据的物化视图
create materialized view mv_address
build deferred
refresh
on commit
as
select ad.id,ad.name adname,ar.name ad_name
from t.address ad,t_area ar
where ad.areaid=ar,id;
创建后执行下列语句查询物化视图
select * from mv_address
查询结果 :