物化试图

来源:互联网 发布:php入门知识 编辑:程序博客网 时间:2024/05/02 04:54
 

         视图是数据库系统中的一个比较简单的概念,它又被称为续表。之所以称它为虚表,是因为它不是存储的实际的数据,而是存储的得到该视图的查询语句。如果查询的定义包含很复杂的表连接、集合函数等等运算内容是,获取视图内容会变得很慢。对这个问题,在现代的数据库管理系统中,都采用了一种空间换时间的解决办法-物化视图。从这个名字都大致可以猜出他的定义。他是一个实际存储数据的视图,不再是原来所说的一个虚表。过去常常以一个基表代替视图,用触发器维护新基表于源表的一致性。在Oracle和SQL Server中这种技术被称为物化视图,而在DB2中称为实例化查询表。
 在Oracle中,物化试图的前身是概要表管理和快照功能。物化视图的主要特性是:当基本表中的数据变化时,物化视图中的数据也会相应更新。物化视图中的数据也可以被更改,且改动能反映到基表中。物化视图为查询优化器提供了更好的查询路径。
要保持物化视图存储的数据为最新数据,需要有同步机制。Oracle提供了三种方式来维护同步:完全刷新(“refresh” complete)、增量刷新(“refresh” fast)、部分刷新(“refresh” force)。它们都可以在创建物化视图的时候指定。完全刷新指当要同步数据时,重新生成整个视图。增量刷新是仅将基本表已经修改的数据行更新到物化视图中。部分刷新可以指DBMS优先选择增量刷新,否则用完全刷新。除了刷新方式以外,数据库管理系统还要选择刷新的时间:刷新的时间可以是事务提交的时候刷新、根据需要刷新或者是指定刷新间隔时间。
 在Oracle中创建物化视图的命令如下:
 CREATE MATERIALIZED VIEW view_name
 build immediate “refresh” force on demand for update enable query rewrite
 AS select * from temp_table
 build immediate “refresh” force指明了物化视图的更新方式,on demand for update指明了物化视图更新的时间。
 物化视图的优点:减少磁盘I/O、减少CPU消耗、加快响应时间。
 物化视图的缺点:可能需要更多的磁盘空间、数据同步给系统带来负担。

         例如:

         主系统创建物化视图的日志:create materialized view log on SEXPORTPDF with primary key, rowid, sequence including new values;

         网上服务创建视图  :create materialized view MV_SEXPORTMANIFEST
                                                                                   refresh fast on demand
                                                                                       start with to_date('19-07-2011 16:21:31', 'dd-mm-yyyy hh24:mi:ss') next /*1:Mins*/ sysdate + 1/(60*24)
                                                                             as
                                                                                select    *      from SEXPORTMANIFEST @LNK_HY3UAT;

   

        单表刷新:EXEC dbms_mview.refresh('MV_SEXPORTMANIFEST')

         刷新组: exec DBMS_REFRESH.MAKE(name => 'mview_refresh_group_FF',list => '',next_date => SYSDATE, interval => '/*1:Mins*/ sysdate + 1/     (60*24)',implicit_destroy => FALSE,lax => FALSE,job => 0,rollback_seg => NULL,push_deferred_rpc => FALSE,refresh_after_errors => TRUE,purge_option => NULL,parallelism => NULL,heap_size => NULL);
);
          exec dbms_refresh.add(name => 'mview_refresh_group_FF', list => 'MV_SEXPORTMANIFEST');

原创粉丝点击