oracle物化视图日志结构物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途。物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当截短后出现名称重复时,Oracle会自动在物化视图日志名称后面加上数字作为序号。物化视图日志在建立时有多种选项:可以指定为ROWID、PRIMARYKEY和OBJECTID几种类型,同时还可以指定SEQUENCE或明确指定列名。上面这些情况产生的物化视图日志的结构都不相同。任何物化视图都会包括的4列:SNAPTIME$$:用于表示刷新时间。DMLTYPE$$:用于表示DML操作类型,I表示INSERT,D表示DELETE,U表示UPDATE。OLD_NEW$$:用于表示这个值是新值还是旧值。N(EW)表示新值,O(LD)表示旧值,U表示UPDATE操作。CHANGE_VECTOR$$:表示修改矢量,用来表示被修改的是哪个或哪几个字段。如果WITH后面跟了ROWID,则物化视图日志中会包含:M_ROW$$:用来存储发生变化的记录的ROWID。如果WITH后面跟了PRIMARYKEY,则物化视图日志中会包含主键列。如果WITH后面跟了OBJECTID,则物化视图日志中会包含:SYS_NC_OID$:用来记录每个变化对象的对象ID。如果WITH后面跟了SEQUENCE,则物化视图日子中会包含:SEQUENCE$$:给每个操作一个SEQUENCE号,从而保证刷新时按照顺序进行刷新。如果WITH后面跟了一个或多个COLUMN名称,则物化视图日志中会包含这些列。下面通过例子进行详细说明:SQL>createtablet_rowid(idnumber,namevarchar2(30),numnumber);表已创建。SQL>creatematerializedviewlogont_rowidwithrowid,sequence(name,num)includingnewvalues;实体化视图日志已创建。SQL>createtablet_pk(idnumberprimarykey,namevarchar2(30),numnumber);表已创建。SQL>creatematerializedviewlogont_pkwithprimarykey;实体化视图日志已创建。SQL>createtypet_objectasobject(idnumber,namevarchar2(30),numnumber);/类型已创建SQL>createtablet_oidoft_object;表已创建。SQL>desct_oid;名称是否为空?类型----------------------------------------------------------------IDNUMBERNAMEVARCHAR2(30)NUMNUMBERSQL>creatematerializedviewlogont_oidwithobjectid;实体化视图日志已创建。建立环境后来看看物化视图日志中包含的字段:SQL>descmlog$_t_rowid;名称是否为空?类型--------------------------------------------------------------NAMEVARCHAR2(30)NUMNUMBERM_ROW$$VARCHAR2(255)SEQUENCE$$NUMBERSNAPTIME$$DATEDMLTYPE$$VARCHAR2(1)OLD_NEW$$VARCHAR2(1)CHANGE_VECTOR$$RAW(255)除了最基本的4列之外,由于指定了ROWID、SEQUENCE和NAME、NUM列,因此物化视图日志中包含了相对应的列。SQL>descmlog$_t_pk;名称是否为空?类型-------------------------------------------------------------IDNUMBERSNAPTIME$$DATEDMLTYPE$$VARCHAR2(1)OLD_NEW$$VARCHAR2(1)CHANGE_VECTOR$$RAW(255)对象表的物化视图日志建立后包含系统对象标识列。一、主键列、ROWID列、OBJECTID列、SEQUENCE列和建立物化视图时指明的列。主键、ROWID或OBJECTID用来唯一表示物化视图日志中的记录。SEQUENCE会根据操作发生的顺序对物化视图日志中的记录编号。建立物化视图时指明的列会在物化视图日志中进行记录。SQL>insertintot_pkvalues(1,'a',5);已创建1行。SQL>updatet_pksetname='c'whereid=1;已更新1行。SQL>deletet_pk;已删除1行。SQL>selectid,dmltype$$frommlog$_t_pk;IDD-----------1I1U1DSQL>insertintot_oidvalues(1,'a',5);已创建1行。SQL>updatet_oidsetname='c'whereid=1;已更新1行。SQL>deletet_oid;已删除1行。SQL>selectsys_nc_oid$,dmltype$$frommlog$_t_oid;SYS_NC_OID$D---------------------------------18DCFDE5D65B4D5A88602D6C09E5CE20I18DCFDE5D65B4D5A88602D6C09E5CE20U18DCFDE5D65B4D5A88602D6C09E5CE20DSQL>rollback;回退已完成。二、时间列当基本发生DML操作时,会记录到物化视图日志中,这时指定的时间4000年1月1日0时0分0秒。如果物化视图日志供多个物化视图使用,则一个物化视图刷新后会将...