oracle

关注公众号 jb51net

关闭
首页 > 数据库 > oracle > Oracle普通视图和物化视图的区别

Oracle普通视图和物化视图的区别及说明

作者:Aries·Zhao

这篇文章主要介绍了Oracle普通视图和物化视图的区别及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

物化视图介绍

物化视图是一种特殊的物理表,“物化”(Materialized)视图是相对普通视图而言的。

普通视图是虚拟表,应用的局限性大,任何对视图的查询,Oracle都实际上转换为视图SQL语句的查询。

这样对整体查询性能的提高,并没有实质上的好处。

刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER

FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。

COMPLETE刷新对整个物化视图进行完全的刷新。

FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。

NEVER指物化视图不进行任何刷新。

物化视图的类型:ON DEMAND、ON COMMIT

二者的区别在于刷新方法的不同:

ON DEMAND:仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;

/*默认情况下,如果没指定刷新方法和刷新模式,则Oracle默认为FORCE和DEMAND。*/
create materialized view mv_tb as select * from tb_name;

/*指定物化视图每天刷新一次*/
create materialized view mv_name refresh force on demand start with sysdate
next sysdate+1; 
/*要指定刷新时间比如每天晚上22: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');

ON COMMIT:一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。

/*创建ON COMMIT物化视图*/
create materialized view mv_tb refresh force on commit as select * from tb_name

创建时生成数据分为两种:build immediate 和 build deferred

分为两种:build immediate 和 build deferred

如果不指定,则默认为 build immediate

案例使用

我们如果遇到需要从其它系统的数据库中取数据进行统计分析的问题,假如双方数据库都是ORACLE11g,同步表:test_mz_fee

1、创建DB_LINK

/*创建DB_LINK*/
create public database link dblink_his connect to system using '192.168.1.73:1521/oracle';
/*删除DB_LINK*/
drop database link dblink_his; 
/*删除的时候报错:ORA-02018:database link of same name has an open connection*/
/*关闭dblink:*/
alter session close database link dblink_his;

2、创建Oracle物化视图快速刷新日志

为配合增量刷新,ORACLE要求要在住表上建立物化视图日志。

create materialized view log on test_mz_fee with primary key  including new values;  

3、创建Oracle物化视图

Oracle物化视图,从名字上面来开,它应该是属于视图,但是确实物化。

其物化是针对普通视图并没有真正的物理存储而言,其实可以简单的把物化视图看做一个物理表。

create materialized view mv_test_mz_fee /*创建物化视图*/  
 build immediate  /*在视图编写好后创建*/  
  refresh fast with primary key  /*根据主表主键增量刷新(fast,增量)  */
 on demand  /*在用户需要时,由用户刷新 */ 
  enable query rewrite  /*可读写*/  
 as  
 select * from test_mz_fee@dblink_his; /*查询语句*/

4、视图刷新

选择使用ORACLE自带工具DBMS_MVIEW工具包中REFRESH方法对物化视图进行刷新。

该方法有两个参数,第一个参数是需要刷新的物化视图名称,第二个参数是刷新方式。

我们可以写存储过来,对每个物化视图调用一次REFRESH方法,也可以使用“,”把物化视图连接以来,一次刷新。如下:*/

create or replace procdure p_mview_refresh as  
begin  
dbms_mview.refresh('mv_test_mz_fee','f');  
end p_mview_refresh;  
 
/*方式2*/
create or replace procdure p_mview_refresh as  
begin  
dbms_mview.refresh('mv_test_mz_fee1,mv_test_mz_fee2','ff');
end p_mview_refresh;  

注意:

5、日志和物化视图要删除

drop materialized view log on test_mz_fee@dblink_his;  
drop materialized view mv_test_mz_fee1;  

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文