物化视图研究

来源:互联网 发布:淘宝七色谷 编辑:程序博客网 时间:2024/04/30 17:44

物化视图研究

1.物化视图可以分为以下三种类型:包含聚集的物化视图;只包含连接的物化视图;嵌套物化视图。三种物化视图的快速刷新的限制条件有很大区别,而对于其他方面则区别不大。创建物化视图时可以指定多种选项,下面对几种主要的选择进行简单说明:

2.创建方式(Build Methods):包括BUILD IMMEDIATE和BUILD DEFERRED两种。BUILD IMMEDIATE是在创建物化视图的时候就生成数据,而BUILD DEFERRED则在创建时不生成数据,以后根据需要在生成数据。默认为BUILD IMMEDIATE

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


4.刷新(Refresh):指当基表发生了DML操作后,物化视图何时采用哪种方式和基表进行同步。刷新的模式有两种:ON DEMAND和ON COMMIT。ON DEMAND指物化视图在用户需要的时候进行刷新,可以手工通过DBMS_MVIEW.REFRESH等方法来进行刷新,也可以通过JOB定时进行刷新。ON COMMIT指出物化视图在对基表的DML操作提交的同时进行刷新。刷新的方法有四种:FAST、COMPLETE、FORCE和NEVER。FAST刷新采用增量刷新,只刷新自上次刷新以后进行的修改。COMPLETE刷新对整个物化视图进行完全的刷新。如果选择FORCE方式,则Oracle在刷新时会去判断是否可以进行快速刷新,如果可以则采用FAST方式,否则采用COMPLETE的方式。NEVER指物化视图不进行任何刷新。默认值是FORCE ON DEMAND。


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

6.物化视图可以进行分区。而且基于分区的物化视图可以支持分区变化跟踪(PCT)。具有这种特性的物化视图,当基表进行了分区维护操作后,仍然可以进行快速刷新操作。 对于聚集物化视图,可以在GROUP BY列表中使用CUBE或ROLLUP,来建立不同等级的聚集物化视图。


Java代码 复制代码
  1. --物化视图on commit  在操作表的时候就进行刷新物化视图。   
  2. CREATE MATERIALIZED VIEW mv_student_1    
  3. REFRESH FORCE     
  4. ON commit    
  5. ENABLE QUERY REWRITE    
  6. AS   
  7. select * from student;  --改成student@ucv 这样是不行的,不能在dblink上使用commit   
  8. commit;   
  9.   
  10. insert into student  values(1,'sdfdsdf');   
  11. insert into student  values(2,'sdfdsdf');   
  12.     
  13. select * from mv_student_1;  




快速刷新:
create materialized view log on tt   --日志

create materialized view mv_tt   --物化视图
refresh fast
as
select id,name from tt;

exec dbms_mview.refresh('mv_tt')  --刷新物化视图

select * from mv_tt;

增量刷新:
  注意要修改:init.ora
  alter system set job_queue_processes=20;
  如果这个参数的大小是0 则刷新是不会起到作用的。

Java代码 复制代码
  1. create materialized view log on tt    
  2.   
  3. create materialized view mv_tt    
  4. REFRESH FAST START WITH SYSDATE     
  5. NEXT  SYSDATE + 2/(24*60*60) ---2秒刷新一次   
  6. as   
  7. select id,name from tt;   
  8.   
  9. delete from tt ;   
  10. insert into tt values(11,'sdfd');   
  11. insert into tt values(12,'sdfd');   
  12. insert into tt values(13,'sdfd');   
  13. commit;   
  14.   
  15. select * from mv_tt;  


SELECT MM.mview_name,MM.last_refresh_dateFROM DBA_MVIEWS MM  --查看物化视图的刷新时间。



物化视图是不能进行增量更新远程数据库表的 --我试过不行,不知道是自己方法不对,还是啥问题。
原创粉丝点击