物化视图介绍
物化视图是一种特殊的物理表,“物化”(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 是在创建物化视图的时候就生成数据 。
- 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;
注意:
- 如果需要同时刷新多个物化视图,必须用逗号把各个物化视图名称连接起来,并对每个视图都要指明刷新方式(f、增量刷新,c、完全刷新,?、强制刷新)。
- 当日志和物化视图创建好后,删除日志,则需要重新创建物化视图,否则无法增量刷新。
- 因为上面写的物化视图时根据主键进行更新,因此,主表必须有主键。*/
5、日志和物化视图要删除
drop materialized view log on test_mz_fee@dblink_his; drop materialized view mv_test_mz_fee1;
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论