物化视图复制概念和体系结构——高级复制

来源:互联网 发布:sql语句分离数据库 编辑:程序博客网 时间:2024/06/05 17:34

一、概述

      Oracle提供两种不同的复制方法:多主复制和物化视图复制。还可以通过两种复制的组合构成混合复制。

本文主要描述物化视图复制,由于物化视图复制中的主站点就是多主复制中的站点,因此也会对相应的多主复制中涉及到的内容作相应的说明。

 

二、物化视图的概念和体系结构

Oracle的物化视图主要用在两个方面:高级复制和数据仓库。在高级复制环境中,物化视图用于复制数据到非主体站点。在数据仓库环境中,物化视图用于对代价昂贵的查询进行缓存。

   

1.物化视图是什么

        物化视图是主体对象在某一时间点上的复制品。这个主体对象即可以是主体站点上的一个主表,也可以是物化视图站点上的一个主物化视图。在多主复制中,一个站点上的表被其他主体站点连续不断的更新,而物化视图则是从一个主体站点或主物化视图站点批量的进行更新。

当物化视图进行快速刷新时,Oracle会检查主表或主物化视图自上次刷新以来的所有改变,并将其应用到物化视图上。因此,如果主体对象自上次刷新以来存在一些改变,则刷新操作则会花费一定的时间把这些改变应用到物化视图上。如果自上次刷新以来没有发生任何变化,则物化视图刷新操作会迅速的完成。

 

2.为什么使用物化视图

       你可以使用物化视图来完成以下目标:

       减轻网络负载;

       创建一个Mass Deployment环境;

       数据子集;

       离线部署

1)减轻网络负载:

       你可以通过物化视图将数据分布到许多站点,所有用户不需要再访问一个数据库服务器,负载被分散到多个数据库服务器上。和多主复制不同的是,你可以根据需要,只复制表中的一部分字段或者表中的一部分数据,从而降低了每次复制的数据量。

       多主复制也可以分布网络负载,但与物化视图相比它对网络的要求要严格得多。由于多主复制各个站点间采用的是网状连接,每个站点和其他所有的站点都有通信,而且多主复制一般用于提供实时或接近实时的复制,这会导致很高的网络流量,对于网络状况要求比较严格。

       物化视图采用高效的批量更新方式,从一个主体站点或一个主物化视图站点获得更新。和多主复制的连续通信不一样,物化视图复制只需要周期性的刷新,从而对网络的要求大大降低。

2)创建Mass Deployment环境:

展开模板允许你在本地预先建立物化视图环境。你可以利用展开模板快速简便的展开物化视图环境。你可以不用修改展开模板,而是利用参数来建立不同用户的客户化数据集。

3)数据子集:

物化视图允许你的复制建立在列或者行的基础上,而多主复制需要复制整张表。通过使用Data subsetting,对于每个站点你可以仅复制满足本站点需要的数据。

4)离线部署:

物化视图不需要专用网络连接。你可以利用job的调度机制完成物化视图的定时自动刷新,你也可以在需要的时候手工刷新物化视图。而这第二种方法是在笔记本上运行应用程序的一种理想解决方案。

 

3.物化视图的分类

       物化视图分为只读、可更新和可写三类。不能对只读物化视图进行DML操作,对于可更新和可写物化视图则可以进行DML操作。

   注意:对于只读、可更新和可写物化视图,定义物化视图的查询语句必须包含主体对象中的所有主键列。

   1)只读物化视图

      在建立物化视图时,省略FOR UPDATE语句建立只读物化视图。除了不需要属于一个物化视图组之外,只读物化视图的许多机制都和可更新物化视图相同。

      使用只读物化视图可以消除在主体站点或者主物化视图站点上由物化视图引入的数据冲突,这个优点的代价是只读物化视图不能进行dml操作。

  注意:使用只读物化视图只能消除由物化视图站点引入的冲突,并不意味着使用只读物化视图就不会由冲突产生,后面会举例详细说明。

  2)可更新物化视图

       在建立物化视图时,指明FOR UPDATE语句建立可更新物化视图。为了可更新物化视图的修改在刷新时可以被推回主体对象,可更新物化视图必须属于一个物化视图组。

   由于可更新物化视图允许数据的修改,因此可以降低主体站点的负载。

   注意:

  A.不要在建立可更新物化视图时使用列的别名,否则,在将物化视图加入到物化视图组的时候会发生错误。

  B.主表或主物化视图列上的默认值不会自动应用到可更新物化视图上。

  C.可更新物化视图不支持DELETE CASCADE操作。

  3)可写物化视图

       可写物化视图指出FOR UPDATE语句,但是没有加入到物化视图组。用户可以对可写物化视图执行DML操作,但是在执行刷新操作时,修改不会被推回,因此所有的修改在刷新后全部丢失。所有允许只读物化视图的情况也同样允许可写物化视图。

   由于可写物化视图很少使用,因此以后大部分内容都只涉及只读物化视图和可更新物化视图。

 

4.物化视图可用性

      Oracle提供几种不同类型的物化视图,以满足各种复制环境的需要。

      介绍下列物化视图以及它们使用的环境:

          主键物化视图;

          对象物化视图;

          ROWID物化视图;

          复杂物化视图。

      当建立物化视图时,不管物化视图属于何种类型,总是给出方案名,也就是查询语句中表的所有者名称。

  1)主键物化视图

      主键物化视图是默认的物化视图。如果主键物化视图是作为物化视图组的一部分建立的,且指定了FOR UPDATE语句,那么这个物化视图是可更新的,且这个物化视图组必须和主站点中复制组的同名。另外,可更新物化视图必须和主复制组在不同的数据库中。

  当修改发生后,修改的数据以行级为单位被传播,每行数据由主键确定。

      主键物化视图可以包含一个子查询,因此你可以在建立物化视图时,建立所有数据的一个子集,也就是说,建立物化视图时可以只选取你需要的数据行。子查询是嵌入在主查询中的查询,因此你可以在建立物化视图时有超过一个的SELECT语句。子查询可以是简单的WHERE语句也可以是复杂的多层WHERE EXISTS语句嵌套。如果主站点中的主对象建立了物化视图日志表,那么一些包含特定类型子查询的主键物化视图仍然可以快速(增量)刷新。快速刷新利用materialized view logs只更新自上次刷新后被修改的记录。

  2)对象物化视图

      如果物化视图是基于对象表,并且在建立是指定了OF TYPE语句,那么这个物化视图叫做对象物化视图。对象物化视图的结构和对象表相同——对象物化视图由行对象组成,每一个行对象由一个对象标识列OID标识。

  3ROWID物化视图

      为了后向兼容性,Oracle除了默认的主键物化视图外,还支持ROWID物化视图。ROWID物化视图基于主对象中行记录的物理标识ROWIDROWID物化视图只被用在基于Oracle7版本的主对象的物化视图,它不能被用于建立基于Oracle8或更高版本主站点的物化视图。

  4)复杂物化视图

      物化视图的定义必须满足某种约束,才能执行快速刷新。如果你需要的物化视图的定义查询语句更为一般化,不能满足限制条件,那么这个物化视图是复杂的,并且不能执行快速刷新。

一般来说,如果一个物化视图的定义查询包含下列语句,则被认为是复杂物化视图:

  CONNECT BY语句;

  INTERSECTMINUSUNION ALL操作;

  在某些情况下的DISTINCTUNIQUE关键字:包含DISTINCTUNIQUE关键字的并不都是复杂物化视图,简单物化视图中也可以包含这两个关键字;

  聚集操作;

  连接不在子查询中的对象;

  某种情况下的UNION操作。

      以及其他任何不满足特定约束条件的子查询。具体条件见物化视图中的数据子集的物化视图子查询约束

  注意:如果可能,尽量避免使用复杂物化视图,因为复杂物化视图不能快速刷新,将会降低网络性能。

  对比简单物化视图和复杂物化视图:

      为了某种应用,你可能需要考虑使用一个复杂物化视图。你有两种方法可以选择,它们各有利弊,具体如下:

  复杂物化视图:这个复杂物化视图在数据库中展示出高效的查询性能,因为连接操作在物化视图刷新时已经完成。然而,由于是复杂物化视图,必须执行完全刷新,这将极为可能比执行快速刷新要慢得多。

  简单物化视图通过视图连接:展示了两个简单物化视图,它们通过一个视图执行连接操作。通过视图查询不可能有方法A中查询复杂物化视图那样的性能。然而,简单物化视图可以更加有效的使用快速刷新和物化视图日志。

  总的来说:

  如果你很少刷新,且需要比较高的查询性能,则使用方法A

  如果你经常刷新,且可以牺牲查询性能,则使用方法B

5.物化视图操作所需权限

      三种不同类型的用户对物化视图执行操作:

      建立者:建立物化视图的用户。

      刷新者:刷新物化视图的用户。

      所有者:拥有物化视图的用户。物化视图存在于所有者的方案中。

      一个用户对物化视图可以执行所有的操作。然而,在一些复制环境中,不同的用户对物化视图执行不同的操作。执行这些操作需要的权限取决于操作由同一个用户执行还是由不同的用户执行。下面详细解释所需权限。

  注意:下文没有包括用重写查询选项来创建物化视图时所需要的权限。

  1)创建者是所有者

      如果一个物化视图的创建者同时也是一个物化视图的所有者,那么这个用户可以通过明确授权或通过角色拥有下列权限来创建一个物化视图。

      CREATE MATERIALIZED VIEW或者CREATE ANY MATERIALIZED VIEW权限;

      CREATE TABLE或者CREATE ANY TABLE权限;

      如果数据库兼容性在8.1.0以下,需要CREATE VIEW或者CREATE ANY VIEW权限;

      对主站点上对象和物化视图日志的SELECT权限或者SELECT ANY TABLE系统权限。如果主站点不是本地数据库,则SELECT权限必须授权给一个主站点用户,这个用户就是物化视图站点通过数据库链连接到主站点的用户。

  2)创建者不是所有者

      如果物化视图的创建者不是所有者,必须授予创建者和所有者某种权限才能创建物化视图。创建者的权限可以直接授权或通过角色授权,但是所有者的权限必须通过明确授权获得。也就是说,所有者的权限不能通过角色获得。

  创建者:

  CREATE ANY MATERIALIZED VIEW系统权限

  所有者:

  CREATE TABLE或者CREATE ANY TABLE权限;

      如果数据库兼容性在8.1.0以下,需要CREATE VIEW或者CREATE ANY VIEW权限;

      对主站点上对象和物化视图日志的SELECT权限或者SELECT ANY TABLE系统权限。如果主站点不是本地数据库,则SELECT权限必须授权给一个主站点用户,这个用户就是物化视图站点通过数据库链连到主站点的用户。

  3)刷新者是所有者

      如果一个物化视图的刷新者同时也是物化视图的拥有者,这个用户需要主站点上对象和物化视图日志的SELECT权限或者SELECT ANY TABLE系统权限。如果主站点不是本地数据库,则SELECT权限必须授权给一个主站点用户,这个用户就是物化视图站点通过数据库链连到主站点的用户。权限可以通过直接授权或通过角色授权。

  4)刷新者不是所有者

      如果物化视图的刷新者不是所有者,必须授予刷新者和所有者某种权限。这些权限可以直接授权或通过角色授权。

  刷新者:

  ALTER ANY MATERIALIZED VIEW系统权限。

  所有者:

      主站点上对象和物化视图日志的SELECT权限或者SELECT ANY TABLE系统权限。如果主站点不是本地数据库,则SELECT权限必须授权给一个主站点用户,这个用户就是物化视图站点通过数据库链连到主站点的用户。

  

6.物化视图中的数据子集

      在某些情况下,你可能希望你的物化视图反映主表或者主物化视图中数据的子集。通过使用WHERE语句,行子集允许你包含主表或者主物化视图中你想要的行记录。列子集允许你从主表或者主物化视图中只包含你所需要的列。在创建物化视图时,通过在SELECT语句中明确指出所要选取的列来实现列子集。如果你使用展开模板来创建你的物化视图,那么你可以在可更新物化视图上定义列子集。

  1)使用数据子集的一些原因

      降低网络流量:在一个使用列子集的物化视图中,只有满足物化视图定义中WHERE条件语句的修改才会传播到物化视图站点,因此减少了事务传输数量,降低了网络流量。

      保护敏感数据:用户只能查看满足物化视图查询定义的数据。

      减少资源需要:如果物化视图建立在笔记本上,则硬盘与服务器上的硬盘相比要小得多。数据子集可以显着的减少存储空间。

      提高刷新性能:由于较少的数据传播到物化视图站点,刷新执行的更加迅速。这一点对于那些需要通过拨号连接来刷新物化视图的用户十分重要。

  2)带子查询的物化视图

      上面的例子是针对单个表的。如果创建基于多个表的物化视图,则定义和维护这些物化视图相对来说困难得多。主要包括多对一子查询、一对多子查询、多对多子查询以及包含UNION操作的子查询几种。这些物化视图比较复杂,而且在实际复制中不经常使用,因此这里不再详细描述。如果对这部分有兴趣,请参阅Oracle9i Advanced Replication 3-18 Materialized Views with Subqueries部分。下面描述一下建立快速刷新子查询物化视图的条件,物化视图子查询约束:

      带子查询的物化视图为了能达到快速刷新的能力,必须满足许多约束条件,具体如下:

      必须是主键物化视图;

      物化视图日志必须包括某些在子查询中出现的列;

      如果子查询是多对多或一对多查询,连接列中非主键的部分必须包括在物化视图日志中,多对一子查询没有这个约束;

      子查询必须是肯定条件,比如,你可以使用EXISTS,但是不能使用NOT EXISTS

      子查询必须使用EXISTS连接到嵌套层,不能使用IN

      每张表只允许一个EXISTS表达式;

      连接表达式必须采用精确匹配或等于连接;

      在子查询中,每张表只能被连接一次;

      在嵌套层中,每张表必须有主键存在;

      嵌套层只能参考比它高的层中的表;

      子查询可以包含AND操作,但是每个OR操作只能连接能确定一条记录的列,子查询中多个OR运算可以通过AND连接;

      子查询中的所有表必须在同一个主体站点或主物化视图站点中。

  

7.决定物化视图的快速刷新能力

      为了检测所创建的带子查询的物化视图是否满足上面提到的建立快速刷新物化视图的种种约束,在创建时,如果违反任何约束条件,则Oracle会返回错误提示。如果在建立物化视图时指明强制刷新,则不会收到任何错误信息。因为在强制刷新时,如果不能执行快速刷新的话,Oracle会自动执行完全刷新。

      你也可以通过DBMS_MVIEW包中的EXPLAIN_MVIEW过程来检测已存在的物化视图甚至是还没有建立的物化视图的一些信息,具体信息如下:

      物化视图的各种能力;

      对于这个物化视图来说每种能力是否可能;

      如果不可能,给出导致这种能力不可能的原因;

      这些信息可以存储在varray中,也可以存储在MV_CAPABILITIES_TABLE表中。如果你希望把信息存储到表中,那么你必须在执行EXPLAIN_MVIEW存储过程以前,执行ORACLE_HOME/rdbms/admin目录下的utlxmv.sql脚本。

 

8.多级物化视图

      物化视图的创建可以基于表,也可以基于其他物化视图,这种物化视图叫做多级物化视图。这种基于其他物化视图的物化视图可以是只读的也可以是可更新的。

      当使用多级物化视图时,基于主体表的物化视图叫做第一层物化视图。基于第一层物化视图的物化视图叫做第二层物化视图。下一层是第三层,依此类推。

      作为其他物化视图的主对象的物化视图叫做主物化视图。处在任何一层的物化视图都可以成为主物化视图,而且可以存在多个其他的物化视图基于同一个主物化视图。

      主物化视图和主站点中的主表起相同的作用。也就是说把第二层物化视图上的改变推到第一层物化视图上的操作和把第一次物化视图上的改变推到主表上的操作是完全一样的。

       在主物化视图站点必须注册一个接收者。在多层物化视图站点中接收者负责接受和应用来自主物化视图站点传播者的延迟事务。

       多层物化视图在设计复制环境时提供了很高的灵活性。一些物化视图站点不需要复制主表中所有的数据,实际上,这些站点可能根本没有足够的空间存储这些数据。另外,只复制较少的数据意味着在网络上活动的数据也较少。

  使用多层物化视图的限制条件:

  主物化视图和基于主物化视图的物化视图都必须满足下列条件:

  1)必须是主键物化视图;

  2)所在数据库兼容性等于或者高于9.0.1

  主物化视图的一些限制。下列类型的物化视图不能作为可更新物化视图的主物化视图。

  1)ROWID物化视图;

  2)复杂物化视图;

  3)只读物化视图。

  不过这三种物化视图可以成为只读物化视图的主物化视图。

  基于物化视图的可更新物化视图的额外限制:

  1)所属的物化视图组必须和主物化视图站点上的物化视图组同名;

  2)必须和主物化视图不在同一个数据库上;

  3)必须基于可更新物化视图,不能基于只读物化视图;

  4)主站点上的主物化视图组必须存在于PUBLIC方案中。

  

9.包含用户定义类型的物化视图

      Oracle的复制支持用户自定义类型数据。Oracle不但支持行对象和列对象而且还支持collections的复制。Collection包括基于用户自定义类型的数组和嵌套表。

  使用用户自定义类型需要注意几点:

      主站点和物化视图站点的数据库兼容性等于或高于9.0.1

      如果主对象包含用户自定义类型,则不能创建refresh-on-commit物化视图;

      高级复制不支持对象的继承。

      物化视图复制中对用户自定义类型的要求和限制于多主环境中的限制比较类似,这里不再详细描述,如果对这部分内容感兴趣,请参考Oracle9i Advanced Replication 3-36 Materialized Views with User-Defined Types

  

10.主站点的物化视图注册

      在主体站点或主物化视图站点,Oracle数据库会自动注册基于主体对象的物化视图的信息。下面介绍物化视图的注册机制

  1)查看关于注册物化视图的信息

      第一层物化视图或物化视图组注册在主体站点。第二层以上的物化视图或物化视图组注册在主物化视图站点。可以查询主站点或主物化视图站点上的DBA_REGISTERED_MVIEWS视图,列出远端物化视图的下列信息:

  1)物化视图的所有者,名称,以及包含物化视图的数据库名;

  2)物化视图的定义查询语句;

  3)其他物化视图属性,比如刷新方法等。

     也可以查询主体站点或主物化视图站点上的DBA_MVIEW_REFRESH_TIMES视图,取得每个物化视图的最后刷新时间。数据库管理员可以查询这些信息来监视远端物化视图的活动。

  2)内部机制

      当你创建物化视图时,Oracle会自动在主体站点或主物化视图站点上注册物化视图,在你删除物化视图时,Oracle会自动取消物化视图的注册。物化视图组和物化视图一样。

  当你删除一个主物化视图时,Oracle不会自动删除那些基于它的物化视图,你必须手工删除这些物化视图。如果你没有删除这个物化视图,且这个物化视图尝试刷新以及别删除的主物化视图,则Oracle会返回错误信息。

      例如:假设物化视图orders_lev1基于主表oe.orders,物化视图orders_lev2基于物化视图orders_lev1。如果你删除了orders_lev1orders_lev2不会被自动删除。这时,如果你尝试去刷新orders_lev2,则Oracle返回错误消息,因为orders_lev1已经不存在了。

  注意:Oracle无法保证在主站点上的注册或取消注册物化视图操作和建立或删除物化视图操作完全一一对应。如果Oracle在创建物化视图时,无法成功的注册,则你必须利用DBMS_MVIEW包的REGISTER_MVIEW过程手工完成注册。如果在删除物化视图时,Oracle无法成功的取消注册,则注册信息会一直保存在主体站点或主物化视图站点,直到你手工取消注册。复杂物化视图有可能无法注册。

  注意:Oracle7版本的主站点不能注册物化视图。

  3)手工物化视图注册

      如果有必要,你可以手工注册物化视图。使用DBMS_MVIEW包中的REGISTER_MVIEWUNREGISTER_MVIEW过程完成主站点上的增加、修改和删除物化视图注册信息。

  

11.主站点和主物化视图站点机制

      下图中包含了物化视图复制环境中涉及到的对象,有些对象是可选的。例如:如果你建立一个只读物化视图,那么在物化视图站点既不需要可更新物化视图日志也不需要内部触发器;如果你建立一个无法快速刷新的复杂物化视图,那么在主站点物化视图日志。

  注意:主物化视图可能同时存在物化视图日志和可更新物化视图日志。在设计主物化视图站点时,应当保证有足够的空间存放这些日志。

  为了支持快速刷新物化视图,下列机制是主体站点或主物化视图站点所需要的。

  1)主表或主物化视图

      主表或主物化视图是物化视图的基础。如果主体对象是主表的话,这张表可能同时成为多主复制和物化视图复制中的对象。物化视图只能指向一个主体站点或主物化视图指点。

  主表或主物化视图上的改变被记录在物化视图日志中,并在刷新过程中,传播并应用到物化视图上。

  注意:快速刷新物化视图可以基于主表或主物化视图建立。但是基于同义词或者视图的物化视图只能执行完全刷新。

  2)内部触发器

      当对主表或主物化视图进行DML操作时,内部触发器将受到影响的行记录在物化视图日志中。记录的信息包括主键、ROWID或对象标识以及其他列的值。当你为主表或主物化视图建立物化视图日志时,会自动建立并激活一个内部的AFTER ROW触发器。只要插入、更新或删除语句修改表中的数据,则触发器会在物化视图日志中插入记录。这个触发器总是最后被点火的触发器。

  3)物化视图日志

      如果你想要采用快速刷新的话,必须建立基于主体对象的物化视图日志。物化视图可以记录主体对象被更新记录的主键、ROWID或对象标识或者二者全部。物化视图日志也可以包含其他列用以支持带子查询的物化视图的快速刷新。

      物化视图日志表的名称为MLOG$_后面跟主体对象的名称。物化视图日志和主体对象建立在相同的用户模式下。一个物化视图日志可以支持多个基于主体对象的物化视图。

  有下列几种物化视图日志:

      主键:物化视图日志在记录主体对象发生变化的记录时,是根据主键定位的。

      ROWID:物化视图日志在记录主体对象发生变化的记录时,是根据ROWID定位的。

      对象标识:物化视图日志在记录主体对象发生变化的记录时,是根据对象标识定位的。

      组合类型:物化视图日志在记录主体对象发生变化的记录时,是根据上面三种类型的组合来定位的。如果物化视图日志根据主键、ROWID和对象标识定位变化的数据,则这种物化视图日志同时支持主键、ROWID和对象物化视图,这种物化视图日志对于一个包含三种类型物化视图的环境是很有用的。

      组合类型物化视图日志和其他类型物化视图日志工作方式相同,只不过多记录了一、二种类型。

      虽然主键物化视图日志和ROWID物化视图日志的差别很小,但是这些差别在实际使用中有着很大的影响。如果ROWID物化视图日志会导致重组和截断十分困难,因为这回导致ROWID发生变化。如果你对主表进行了重组和截断,那么ROWID物化视图必须执行完全刷新。

  1)基于对象表的物化视图日志

      你可以在对象表上建立物化视图日志。

      当你创建基于这个类型的对象表时,你可以指出对象标识是系统产生的或者基于主键的。

      当你为对象表创建物化视图日志时,你必须指明WITH OBJECT ID语句记录对象标识。如果对象标识是基于主键的,你也可以指明记录主键。

  2)导入物化视图和物化视图日志到其他用户模式下的约束

      导出的物化视图和物化视图日志DDL语句中明确给出了方案名称。因此物化视图和物化视图日志不能导入到其他用户方案中。如果你尝试使用FROM USERTO USER选项导入物化视图或物化视图日志,则导入过程中会收到错误。

 

三、通过物化视图同步数据

在工作中需要同步两个数据库的数据,那么最简单的方法是通过物化视图来实现。当然也可以通过流复制、高级复制、Data Gurad或者通过第三方软件来实现如quest shareplex来实现。 下面通过实例来介绍下如何实现两个数据库的数据同步。

假设有两个数据库:nbglsqsj,现在需要将nbgl数据库中的表sqkz_sqxx复制到数据库sqsj中。

 

1.操作步骤

1)首先在nbgl数据库中创建一个物化视图日志,我们这里要做表sqkz_sqxx的物化视图,那么就创建改表的物化视图日志,命令为:create materialized view log on sqkz_sqxx;

执行完毕就会有生成一个mlog$_sqkz_sqxx的表,其结构为

        

2)在sqsj数据库上创建一个连接nbgl的数据库连接,脚本为:

create database link NBGL82

   connect to nbgl identified by jms_goodsystem 

using '(DESCRIPTION =

(ADDRESS_LIST =

(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.82)(PORT = 1521))

)

(CONNECT_DATA =

(SERVICE_NAME = nbgl)

)

)';

3)在sqsj数据库上创建物化视图sqkz_sqxx,脚本为:

--创建物化视图

create materialized view sqkz_sqxx

build immediate

refresh fast

start with sysdate

next sysdate+1/288

--for update  指明for update 则为可写物化视图,省略则为默认的只读物化视图

as  select * from sqkz_sqxx@nbgl001081;

 

2.测试验证

nbgl表里增加、删除、更新数据三条数据,则在mlog$_sqkz_sqxx表里增加三条记录(可能会查询不到记录,因为刷新sqsj库中的物化视图后会不久这个日志就自动清空了)

sqsj中的sqkz_sqxx物化视图会把这三条记录从mlog$_sqkz_sqxx表中读取,并更新物化视图,并将mlog$_sqkz_sqxx中的数据删除。

删除日志: DROP materialized view log on sqkz_sqxx;  

注意:不可以直接drop table删掉物化视图对应的日志表

删除物化视图 drop materialized view sqkz_sqxx;  

基本和对表的操作一致 ,物化视图由于是物理真实存在的,故可以创建索引。  

原创粉丝点击