在11.2中,物化视图日志也新增了一些功能,对于本地物化视图而言,现在可以利用COMMIT SCN来替代以前版本中的TIMESTAMP方式来进行刷新。






看一个简单的例子:


SQL> SELECT * FROM V$VERSION;


BANNER


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


Oracle Database11gEnterprise Edition Release11.2.0.1.0 - 64bit Production


PL/SQL Release 11.2.0.1.0 - Production


CORE    11.2.0.1.0      Production


TNS for Linux: Version 11.2.0.1.0 - Production


NLSRTL Version 11.2.0.1.0 - Production


SQL> CREATE TABLE T


 2  (ID NUMBER PRIMARY KEY,


 3  NAME VARCHAR2(30),


 4  AGE NUMBER);


表已创建。


SQL> CREATE MATERIALIZED VIEW LOG ON T WITH COMMIT SCN;


实体化视图日志已创建。


SQL> INSERT INTO T


 2  VALUES (1, 'TEST', 18);


已创建1行。


SQL> SELECT * FROM MLOG$_T;


       ID D O CHANGE_VECTOR$$                     XID$$


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


        1 I N FE                             2.8148E+15


和普通的TIMESTAMP的物化视图不同,物化视图日志中不再记录TIMESTAMP列,而是记录了修改的XID信息,通过XID和SCN来判断一个物化视图是否需要刷新对应的记录。


通过这种方式,可以提高物化视图刷新的性能。


不过由于SCN只能用在本地使用,因此这种物化视图日志只支持本地的物化视图,而远端物化视图则不支持。


SQL> CREATE DATABASE LINK TEST112@TEST112 USING '172.25.198.230/TEST112';


数据库链接已创建。


SQL> SELECT GLOBAL_NAME FROM GLOBAL_NAME@TEST112@TEST112;


GLOBAL_NAME


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


TEST112


SQL> CREATE MATERIALIZED VIEW MV_T1


 2  REFRESH FAST


 3  AS SELECT * FROM T@TEST112@TEST112;


CREATE MATERIALIZED VIEW MV_T1


*


第1行出现错误:


ORA-32415:具有基于提交SCN的实体化视图日志的从表不支持可快速刷新的远程实体化视图




SQL> CREATE MATERIALIZED VIEW MV_T


 2  REFRESH FAST


 3  AS SELECT * FROM T;


实体化视图已创建。


由于当前只有一个11.2版本的数据库,为了演示远端访问,创建了一个指向当前数据库的数据库链,可以看到建立本地的物化视图没有问题,但是远端物化视图不能基于SCN的物化视图日志。


除了可以创建基于主键或ROWID的单表物化视图外,本地基于连接、聚集或UNION ALL的物化视图都可以利用COMMIT SCN的物化视图日志。


但是,如果表中包含了LOB列,则建立COMMIT SCN的物化视图日志报错:


SQL> CREATE TABLE T_LOB


 2  (ID NUMBER PRIMARY KEY,


 3  CONTENT CLOB);


表已创建。


SQL> CREATE MATERIALIZED VIEW LOG ON T_LOB WITH COMMIT SCN;


CREATE MATERIALIZED VIEW LOG ON T_LOB WITH COMMIT SCN


*


第1行出现错误:


ORA-32421:具有LOB列的表不支持基于提交SCN的实体化视图日志


另外,如果物化视图依赖多个物化视图日志,那么这些物化视图必须都是基于TIMESTAMP或者都是基于COMMIT SCN的,而不能是二者混和的,否则会报错:


SQL> CREATE TABLE T1          


 2  (ID NUMBER PRIMARY KEY,


 3  NAME VARCHAR2(30));


表已创建。


SQL> CREATE TABLE T2


 2  (ID NUMBER PRIMARY KEY,


 3  FID NUMBER,


 4  ADDRESS VARCHAR2(30));


表已创建。


SQL> CREATE MATERIALIZED VIEW LOG ON T1 WITH ROWID (ID);


实体化视图日志已创建。


SQL> CREATE MATERIALIZED VIEW LOG ON T2 WITH ROWID, COMMIT SCN (ID, FID);


实体化视图日志已创建。


SQL> CREATE MATERIALIZED VIEW MV_T12


 2  REFRESH FAST


 3  AS SELECT T1.ROWID ROWID1, T2.ROWID ROWID2, T1.ID ID1, T2.ID ID2


 4  FROM T1, T2


 5  WHERE T1.ID = T2.FID;


FROM T1, T2


    *


第4行出现错误:


ORA-32414:实体化视图日志互不兼容,无法进行快速刷新


这是由于包含COMMIT SCN的物化视图日志的快速刷新方式已经发生了改变。


oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html