物化视图使用

oracle物化视图


一、创建物化视图主要语法

create materialized view [view_name]
      {TABLESPACE (表空间名)} --保存表空间
      {BUILD [DEFERRED|IMMEDIATE(默认值)]} --延迟刷新还是立即刷新
refresh [fast|complete| force ]
[
on [ commit |demand] |
start with (start_time) next (next_time)
]
as
{创建物化视图用的查询语句}

二、相关参数说明

创建物化视图主要选项说明

创建物化视图时可以指定多种选项,下面对几种主要的选项进行简单说明:

名称 ON PREBUILD TABLE
描述 将已经存在的表注册为实体化视图。同时还必须提供描述创建该表的查询的 SELECT 子句。可能无法始终保证查询的精度与表的精度匹配。为了克服此问题,应该在规范中包含 WITH REDUCED PRECISION 子句。
名称 Build Clause 创建方式
描述 包括BUILD IMMEDIATE和BUILD DEFERRED两种
取值 BUILD IMMEDIATE 在创建实体化视图的时候就生成数据
BUILD DEFERRED 在创建时不生成数据,以后根据需要在生成数据
默认 BUILD IMMEDIATE
名称 Refresh 刷新子句
描述 当基表发生了DML操作后,实体化视图何时采用哪种方式和基表进行同步
语法
[refresh [fast | complete | force]
         [on demand | commit]
         [start with date]
         [next date]
         [with {primary key | rowid}]
]
取值 FAST 采用增量刷新,只刷新自上次刷新以后进行的修改
COMPLETE 对整个物化视图进行完全的刷新
FORCE(默认) Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用Fast方式,否则采用Complete的方式,Force选项是默认选项
 
ON DEMAND(默认) 物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新
ON COMMIT 实体化视图在对基表的DML操作提交的同时进行刷新
 
START WITH 第一次刷新时间
 
NEXT 刷新时间间隔
 
WITH PRIMARY KEY(默认) 生成主键实体化视图,也就是说实体化视图是基于表的主键,而不是ROWID(对应于ROWID子句)。 为了生成PRIMARY KEY子句,应该在表上定义主键,否则应该用基于ROWID的实体化视图。主键实体化视图允许识别实体化视图表而不影响实体化视图增量刷新的可用性
WITH ROWID 只有一个单一的主表,不能包括下面任何一项:

●Distinct

●聚合函数

●Group by

●子查询

●连接

●SET操作

   
名称 Query Rewrite 查询重写
描述 包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的实体化视图是否支持查询重写。查询重写是指当对实体化视图的基表进行查询时,Oracle会自动判断能否通过查询实体化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的实体化视图中读取数据
取值 ENABLE QUERY REWRITE 支持查询重写
DISABLE QUERY REWRITE 不支持查询重写
默认 DISABLE QUERY REWRITE

创建实体化试图日志主要选项说明

如果需要进行快速刷新,则需要建立实体化视图日志。实体化视图日志根据不同实体化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。

名称 WITH Clause
描述  
取值 OBJECT ID 如果是对象实体化视图(object materialized view),则只能采用该方式
PRIMARY KEY  
ROWID  
SEQUENCE  
默认 PRIMARY KEY

三、举例说明


1、简单示例

create materialized view MV_except_pattern_orders
refresh Complete on demand
       start with to_date( '2010-11-06 13:20:51' , 'YYYY-MM-DD HH24:MI:SS' ) next sysdate+1/(24*60)
as
     select * from v_except_pattern_orders

2、带日志物化视图

--创建物化视图日志
create materialized view log on table1
tablespace ts_data --日志保存在特定的表空间
with rowid;

--创建物化视图主体
create materialized view MV_LVY_LEVYDETAILDATA
TABLESPACE ZGMV_DATA --保存表空间
BUILD DEFERRED --延迟刷新不立即刷新
refresh force --如果可以快速刷新则进行快速刷新,否则完全刷新
on demand --按照指定方式刷新
start with to_date( '24-11-2005 18:00:10' , 'dd-mm-yyyy hh24:mi:ss' ) --第一次刷新时间
next TRUNC(SYSDATE+1)+18/24 --刷新时间间隔
as
as select * from table1;
3.物化视图操作示例

1.创建物化视图需要的权限:
GRANT  CREATE MATERIALIZED VIEW  TO USER_NAME;
2.在源表建立物化视图日志  
CREATE MATERIALIZED VIEW LOG ON DAVE
TABLESPACE BISONCU_SPACE           -- 日志空间
WITH PRIMARY KEY;                   -- 指定为主键类型

3.  授权给中间用户  


GRANT SELECT ON DAVE TO ANQING;
GRANT SELECT ON MLOG$_DAVE TO ANQING;

4.在目标数据库上创建MATERIALIZED VIEW  

CREATE  MATERIALIZED VIEW AICS_DAVE
TABLESPACE   BISONCS_SPACE
REFRESH FAST
 ON DEMAND
   --第一次刷新时间
   --START WITH to_date('2012-01-01 20:00:00', 'yyyy-mm-dd hh24:mi:ss')
   START WITH SYSDATE
   --刷新时间间隔。每1天刷新一次,时间为凌晨2点
   --NEXT TRUNC(SYSDATE,'dd')+1+2/24
   NEXT SYSDATE+1/24/20
WITH PRIMARY KEY
--USING DEFAULT LOCAL ROLLBACKSEGMENT
DISABLE QUERY REWRITE AS
SELECT MODEL_ID, STATUS,MODEL_NAME, MANU_ID, DESCRIPTION, CREATE_TIME, UPDATE_TIME, SW_VERSION
FROM AICS_DAVE@LINK_DAVE;

5.  在目标物化视图上创建索引 

CREATE INDEX IDX_T_DV_CT
   ON AICS_DEV_INFO (CREATE_TIME, UPDATE_TIME)
   TABLESPACE     &BISON_IDX;
 
CREATE INDEX IDX_T_DV_UT
   ON AICS_DEV_INFO (UPDATE_TIME)
   TABLESPACE &BISON_IDX;
 
CREATE INDEX I_T_DV_MSISDN
   ON AICS_DEV_INFO (MSISDN)
   TABLESPACE &BISON_IDX;


6. 物化视图刷新说明

(1)使用dbms_mview.refresh 手工刷新
EXEC  DBMS_MVIEW.REFRESH('MV_DAVE'); 
--完全刷新
EXEC DBMS_MVIEW.REFRESH(LIST => 'MV_DAVE',METHOD => 'c');
EXEC DBMS_MVIEW.REFRESH('MV_DAVE','C');
 
--快速刷新
EXEC DBMS_MVIEW.REFRESH(LIST => 'MV_DAVE',METHOD => 'f');
EXEC DBMS_MVIEW.REFRESH('MV_DAVE','F');

(2)使用dbms_refresh.refresh 过程来批量刷新MVIEWS
          如果我们在创建物化视图的过程指定start 和next time的刷新时间,那么Oracle 会自动创建刷新的job,并采用dbms_refresh.refresh 的方式。

            使用这种方式刷新之前需要先make refresh group,然后才可以刷新。

            Refreshmake 的语法可以参考:
http://docs.oracle.com/cd/B19306_01/server.102/b14227/rarrefreshpac.htm#i94057
示例:
        假设存在物化视图MV_T1, MV_T2, MV_T3. 创建refresh group的语法如下:


SQL> EXEC DBMS_REFRESH.MAKE('REP_TEST', 'MV_T1,MV_T2,MV_T3', SYSDATE, 'SYSDATE+ 1')
 
--刷新整个refresh group 组:
SQL> EXEC DBMS_REFRESH.REFRESH('REP_TEST')
 
7. 删除物化视图及日志

--删除物化视图日志:
DROP   MATERIALIZED  VIEW  LOG   ON DAVE;
--删除物化视图
DROP   MATERIALIZED  VIEW   MV_DAVE;

8.查看物化视图刷新状态信息

SQL> SELECT MVIEW_NAME, LAST_REFRESH_DATE, STALENESS FROM   USER_MVIEWS;
SQL> SELECT NAME, LAST_REFRESH FROM    USER_MVIEW_REFRESH_TIMES ;

9. 查询物化视图日志:
SELECT * FROM MLOG$_DAVE;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值