oracle物化视图没有更新,Oracle物化视图日志与快速刷新说明

本文详细介绍了Oracle物化视图日志的结构、功能及快速刷新机制。物化视图日志用于支持物化视图的增量刷新,通过记录DML操作类型、变化字段等信息,确保数据一致性。在刷新物化视图时,Oracle会依据SNAPTIME$$列判断刷新哪些记录,并在刷新后更新SNAPTIME$$的值。物化视图日志能支持多个物化视图的快速刷新,通过SNAPTIME$$列协调不同物化视图的刷新顺序,确保数据一致性。
摘要由CSDN通过智能技术生成

一.物化视图日志格式说明

Oracle 物化视图说明

Oracle 的物化视图的快速刷新要求必须建立物化视图日志,通过物化视图日志可以实现增量刷新功能。

官网的说明如下:

A materializedview log is required on a master to perform a fast refresh on materializedviews based on the master. When you create a materialized view log for a mastertable or master materialized view, Oracle creates an underlyingtable as the materialized view log. A materialized viewlog can hold the primary keys, rowids, or object identifiers of rows, or both,that have been updated in the master table or master materialized view.A materialized view log can also contain other columns to support fastrefreshes of materialized views with subqueries.

--物化视图日志在建立时有多种选项:可以指定为ROWID、PRIMARY KEY和OBJECTID几种类型,同时还可以指定SEQUENCE或明确指定列名。不过上面这些情况产生的物化视图日志的结构都不相同。

The name of amaterialized view log's table is MLOG$_master_name. The materialized viewlog is created in the same schema as the target master. One materialized viewlog can support multiple materialized views on its master table or mastermaterialized view. As described in the previoussection, the internal trigger adds change information to the materialized viewlog whenever a DML transaction has taken place on the target master.

--这里要注意,当发生DML操作时,内部的触发器会把变化记录到物化视图日志里,也就是说物化视图不支持DDL的同步,所以在物化视图的编写过程中不可使用select * from的形式,因为这样当基表发生变化时,物化视图就会失效。

物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,Oracle会自动在物化视图日志名称后面加上数字作为序号。

虽然物化视图格式会有不同,但任何物化视图都会包括如下列:

--这是一个primarykey的物化视图日志:

SQL> desc MLOG$_BS_CHNGROUP_REL

Name                                     Null?    Type

------------------------------------------------- ------------

GROUP_ID                                          VARCHAR2(10)

PARENT_GROUP_ID                                  VARCHAR2(10)

SNAPTIME$$                                         DATE

DMLTYPE$$                                         VARCHAR2(1)

OLD_NEW$$                                         VARCHAR2(1)

CHANGE_VECTOR$$                                    RAW(255)

XID$$                                             NUMBER

相关解释如下:

SNAPTIME$$:用于表示刷新时间。

DMLTYPE$$:用于表示DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。

OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。

CHANGE_VECTOR$$:表示修改矢量,用来表示被修改的是哪个或哪几个字段。

NSERT和DELETE操作都是记录集的,即INSERT和DELETE会影响整条记录。而UPDATE操作是字段集的,UPDATE操作可能会更新整条记录的所有字段,也可能只更新个别字段。

无论从性能上考虑还是从数据的一致性上考虑,物化视图刷新时都应该是基于字段集。Oracle就是通过CHANGE_VECTOR$$列来记录每条记录发生变化的字段包括哪些。

基于主键、ROWID和OBJECT ID的物化视图日志在CHANGE_VECTOR$$上略有不同,但是总体设计的思路是一致的。

CHANGE_VECTOR$$列是RAW类型,其实Oracle采用的方式就是用每个BIT位去映射一个列。

比如:第一列被更新设置为02,即00000010。第二列设置为04,即00000100,第三列设置为08,即00001000。当第一列和第二列同时被更新,则设置为06,00000110。如果三列都被更新,设置为0E,00001110。

依此类推,第4列被更新时为10,第5列20,第6列40,第7列80,第8列0001。当第1000列被更新时,CHANGE_VECTOR$$的长度为1000/4+2为252。

除了可以表示UPDATE的字段,还可以表示INSERT和DELETE。DELETE操作CHANGE_VECTOR

列为全0,具体个数由基表的列数决定。INSERT操作的最低位为FE如果基表列数较多,而存在高位的话,所有的高位都为FF。如果INSERT操作是前面讨论过的由UPDATE操作更新了主键造成的,则这个INSERT操作对应的CHANGEVECTOR列为全FF。

如果WITH后面跟了ROWID,则物化视图日志中会包含:

M_ROW$$:用来存储发生变化的记录的ROWID。

如果WITH后面跟了PRIMARY KEY,则物化视图日志中会包含主键列。

如果WITH后面跟了OBJECT ID,则物化视图日志中会包含:

SYS_NC_OID$:用来记录每个变化对象的对象ID。

如果WITH后面跟了SEQUENCE,则物化视图日子中会包含:

SEQUENCE$$:给每个操作一个SEQUENCE号,从而保证刷新时按照顺序进行刷新。

如果WITH后面跟了一个或多个COLUMN名称,则物化视图日志中会包含这些列。

二.根据物化视图日志来快速刷新数据

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值