在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