Oracle 的物化视图(不积跬步,无以至千里)

一、物化视图的一般用法
物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。这样对整体查询性能的提高,并没有实质上的好处
1、物化视图的类型ON DEMAND、ON COMMIT。二者的区别在于刷新方法的不同,ON DEMAND顾名思义,仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;而ON COMMIT是说,一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。
创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:
创建方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。BUILD IMMEDIATE是在创建物化视图的时候就生成数据,而BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILD IMMEDIATE。
查询重写(Query Rewrite):包括ENABLE QUERY REWRITE和DISABLE QUERY REWRITE两种。分别指出创建的物化视图是否支持查询重写。查询重写是指当对物化视图的基表进行查询时,Oracle会自动判断能否通过查询物化视图来得到结果,如果可以,则避免了聚集或连接操作,而直接从已经计算好的物化视图中读取数据。默认为DISABLE QUERY REWRITE
2、ON DEMAND物化视图物化视图的创建本身是很复杂和需要优化参数设置的,特别是针对大型生产数据库系统而言。但Oracle允许以这种最简单的,类似于普通视图的方式来做,所以不可避免的会涉及到默认值问题。也就是说Oracle给物化视图的重要定义参数的默认值处理是我们需要特别注意的。物化视图的特点:
创建语句:
create materialized view mv_name as select * from table_name;
默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND
物化视图的数据怎么随着基表而更新?
Oracle提供了两种方式,手工刷新和自动刷新,默认为手工刷新。也就是说,通过我们手工的执行某个Oracle提供的系统级存储过程或包,来保证物化视图与基表数据一致性。这是最基本的刷新办法了。自动刷新,其实也就是Oracle会建立一个job,通过这个job来调用相同的存储过程或包,加以实现。
ON DEMAND物化视图的特性及其和ON COMMIT物化视图的区别,即前者不刷新(手工或自动)就不更新物化视图,而后者不刷新也会更新物化视图,——只要基表发生了COMMIT。
创建定时刷新的物化视图(指定物化视图每天刷新一次):
create materialized view mv_name refresh force on demand start with sysdate next sysdate+1;
上述创建的物化视图每天刷新,但是没有指定刷新时间,如果要指定刷新时间(比如每天晚上10:00定时刷新一次):
create materialized view mv_name refresh force on demand start with sysdate next to_date( concat( to_char( sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss');


3、ON COMMIT物化视图ON COMMIT物化视图的创建,和上面创建ON DEMAND的物化视图区别不大。因为ON DEMAND是默认的,所以ON COMMIT物化视图,需要再增加个参数即可。
需要注意的是,无法在定义时仅指定ON COMMIT,还得附带个参数才行。创建ON COMMIT物化视图create materialized view mv_name refresh force on commit as select * from table_name;
备注:实际创建过程中,基表需要有主键约束,否则会报错(ORA-12014)


4、物化视图的刷新刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。
刷新的模式有两种:ON DEMAND和ON COMMIT。
刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。


对于已经创建好的物化视图,可以修改其刷新方式,比如把物化视图mv_name的刷新方式修改为每天晚上10点刷新一次:
alter materialized view mv_name refresh force on demand start with sysdate next to_date(concat(to_char(sysdate+1,'dd-mm-yyyy'),' 22:00:00'),'dd-mm-yyyy hh24:mi:ss');


5、物化视图日志如果需要进行快速刷新,则需要建立物化视图日志。物化视图日志根据不同物化视图的快速刷新的需要,可以建立为ROWID或PRIMARY KEY类型的。还可以选择是否包括SEQUENCE、INCLUDING NEW VALUES以及指定列的列表。
可以指明ON PREBUILD TABLE语句将物化视图建立在一个已经存在的表上。这种情况下,物化视图和表必须同名。当删除物化视图时,不会删除同名的表。这种物化视图的查询重写要求参数QUERY_REWRITE_INTEGERITY必须设置为trusted或者stale_tolerated





CREATE MATERIALIZED VIEW **_emp_expend
LOGGING
NOPARALLEL
BUILD IMMEDIATE 
REFRESH FORCE ON DEMAND
AS
SELECT
* FROM *****


现在记录下物化视图的创建过程(以一张表为例)
1.需要同步过来的表名叫:GG_ZLX_ZHU,对方数据库用户名:username,密码:password,SID:CPEES。
首先要创建DB_LINK


CREATE DATABASE LINK to_cpees  
CONNECT TO "username" identified by "password"  
using "CPEES" 


其中CPEES为新建的到对方数据库的TNS。执行,现在我们就已经创建了到对方数据库的DB_LINK TO_CPEES
2、创建Oracle物化视图快速刷新日志 
视图的刷新将采用增量刷新的方式,因此,为配合增量刷新,ORACLE要求要在住表上建立物化视图日志。


CREATE MATERIALIZED VIEW LOG ON GG_ZLX_ZHU  
 WITH PRIMARY KEY  
 INCLUDING NEW VALUES;  
 
(上面的SQL要在远程数据库上执行,不能在本地执行)
3、创建Oracle物化视图


Oracle物化视图,从名字上面来开,它应该是属于视图,但是确实物化。其物化是针对普通视图并没有真正的物理存储而言,其实可以简单的把物化视图看做一个物理表(不再做具体解释)。


CREATE MATERIALIZED VIEW GG_ZLX_ZHU --创建物化视图  
 BUILD IMMEDIATE  --在视图编写好后创建  
 REFRESH FAST WITH PRIMARY KEY  --根据主表主键增量刷新(FAST,增量)  
ON DEMAND  -- 在用户需要时,由用户刷新  
 ENABLE QUERY REWRITE  --可读写  
 AS  
 SELECT * FROM GG_ZLX_ZHU@TO_CPEES; --查询语句 
4、视图刷新


根据业务需要,每月不定时刷新,所以不能是JOB,而且数量多,所以也不能一个一个刷新。根据以上条件,选择使用ORACLE自带工具DBMS_MVIEW工具包中REFRESH方法对物化视图进行刷新。该方法有两个参数,第一个参数是需要刷新的物化视图名称,第二个参数是刷新方式。我们可以写存储过来,对每个物化视图调用一次REFRESH方法,也可以使用“,”把物化视图连接以来,一次刷新。如下:


CREATE OR REPLACE PROCDURE P_MVIEW_REFRESH AS  
 BEGIN  
 DBMS_MVIEW.REFRESH('GG_ZLX_ZHU','f');  
 END P_MVIEW_REFRESH;  
 


、如果需要同时刷新多个物化视图,必须用逗号把各个物化视图名称连接起来,并对
每个视图都要指明刷新方式(f、增量刷新,c、完全刷新)






刷新物化视图自动刷新:
(1) 使用commit选项。
(2) 使用dbms_mview安排自动刷新时间。
手工刷新:
SQL>execute dbms_mview.refresh('GG_ZLX_ZHU');  --刷新指定的物化视图
SQL>execute dbms_mview.refresh_defresh_dependent('GG_ZLX_ZHU');  ――刷新利用了该表的所有物化视图
SQL>execute dbms_mview.refresh_all_mviews;   ――刷新该模式中,自上次刷新以来,未得到刷新的所有物化视图。




禁用物化视图- 修改init.ora参数的query_rewrite_enabled参数设置成flase,重启实例。
- 使用alter system set query_rewrite_enabled = flase;动态修改。
- 使用alter session set query_rewrite_enabled = flash;修改会话内。
- 使用 norewrite提示。
删除物化视图SQL>drop materialized view emp_by_district;








你可能感兴趣的:(Oracle 的物化视图(不积跬步,无以至千里))