Oracle数据库高级-物化视图

#如何看待IBM中国研发部裁员?#

(一)什么是物化视图

          视图是一张虚拟表( 也可以认为是一条语句 ),基于创建是指定的查询语句返回的结果集,每次访问他都会导致这个查询语句被执行一次 。为了避免每次访问都执行这个查询,可以将这个查询结果集存储到一个物化视图( 也叫实体化视图 )。
 

         物化视图与普通的视图相比的区别是物化视图是建立的副本,他类似于一张表 ,需要占用存储空间 ,而对一个物化视图查询的执行效率与查询一个表是一样 。

(二)创建物化视图语法

CREATE METERIALIZED VIEW view_name
[ BUILD IMMEDIATE  |  BUILD DEFERRED]

[

ON   [ COMMIT   |DEMAND   ]     |     START   WITH     (start_time)     NEXT
(next_time)

]
AS

subquery

          注释:

          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 

查询结果 : 

 

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值