一、概述
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