测试内容
以上可知,用于复制的物化视图作为预计算物化视图的基表是不支持快速刷新的,而建立完全刷新的物化视图则没有问题。
http://yangtingkun.itpub.net/post/468/207875
用于复制功能的物化视图作为预计算物化视图的基表,会导致预计算物化视图无法快速刷新。
测试环境:
SQL> select * from v$version where rownum < 2;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
C:\Windows\system32>sqlplus lau/lau@oralife --这个实例相当于远程库
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 1月 13 20:45:42 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> CREATE TABLE DIM_A (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));
表已创建。
SQL> CREATE TABLE DIM_B (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));
表已创建。
SQL> CREATE TABLE FACT (ID NUMBER PRIMARY KEY, AID NUMBER, BID NUMBER, NUM NUMBER,
2 CONSTRAINT FK_FACT_AID FOREIGN KEY (AID) REFERENCES DIM_A(ID),
3 CONSTRAINT FK_FACT_BID FOREIGN KEY (BID) REFERENCES DIM_B(ID));
表已创建。
SQL> INSERT INTO DIM_A SELECT ROWNUM, 'A'||ROWNUM FROM USER_OBJECTS;
已创建6行。
SQL> INSERT INTO DIM_B SELECT ROWNUM, 'B'||ROWNUM FROM USER_OBJECTS;
已创建6行。
SQL> INSERT INTO FACT SELECT ROWNUM, MOD(ROWNUM, 6) + 1, MOD(ROWNUM, 5 ) + 1, ROWNUM *2
2 FROM USER_OBJECTS;
已创建6行。
SQL> CREATE MATERIALIZED VIEW LOG ON DIM_A WITH PRIMARY KEY, ROWID;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON DIM_B WITH PRIMARY KEY, ROWID;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON FACT WITH PRIMARY KEY, ROWID;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW MV_FACT REFRESH FAST AS
2 SELECT F.ROWID F_ROWID, A.ROWID A_ROWID, B.ROWID B_ROWID, F.ID,
3 A.NAME A_NAME, B.NAME B_NAME, NUM
4 FROM FACT F, DIM_A A, DIM_B B
5 WHERE F.AID = A.ID
6 AND F.BID = B.ID;
实体化视图已创建。
SQL> quit
从 Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options 断开
C:\Windows\system32>sqlplus rem/rem@remoteor --这个实例相当于本地库
SQL*Plus: Release 10.2.0.1.0 - Production on 星期五 1月 13 21:55:29 2012
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> create public database link lau.oralife.cn connect to lau identified by lau using 'ORALIFE';
数据库链接已创建。
SQL> select * from dim_a@lau.oralife.cn;
ID NAME
---------- ------------------------------
1 A1
2 A2
3 A3
4 A4
5 A5
6 A6
已选择6行。
SQL> CREATE MATERIALIZED VIEW DIM_A REFRESH FAST AS SELECT * FROM DIM_A@lau.oralife.cn;
实体化视图已创建。
SQL> CREATE MATERIALIZED VIEW DIM_B REFRESH FAST AS SELECT * FROM DIM_B@lau.oralife.cn;
实体化视图已创建。
SQL> CREATE MATERIALIZED VIEW FACT REFRESH FAST AS SELECT * FROM FACT@lau.oralife.cn;
实体化视图已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON DIM_A WITH ROWID;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON DIM_B WITH ROWID;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW MV_FACT REFRESH FAST AS
2 SELECT F.ROWID F_ROWID, A.ROWID A_ROWID, B.ROWID B_ROWID, F.ID,
3 A.NAME A_NAME, B.NAME B_NAME, NUM
4 FROM FACT F, DIM_A A, DIM_B B
5 WHERE F.AID = A.ID
6 AND F.BID = B.ID;
FROM FACT F, DIM_A A, DIM_B B
*
第 4 行出现错误:
ORA-12053: 这不是一个有效的嵌套实体化视图
SQL> @?/RDBMS/ADMIN/UTLXMV
表已创建。
SQL> BEGIN
2 DBMS_MVIEW.EXPLAIN_MVIEW('SELECT F.ROWID F_ROWID, A.ROWID A_ROWID, B.ROWID B_ROWID, F.ID,
3 A.NAME A_NAME, B.NAME B_NAME, NUM
4 FROM FACT F, DIM_A A, DIM_B B
5 WHERE F.AID = A.ID
6 AND F.BID = B.ID');
7 END;
8 /
PL/SQL 过程已成功完成。
SQL> SELECT CAPABILITY_NAME, POSSIBLE, MSGTXT
2 FROM MV_CAPABILITIES_TABLE
3 WHERE CAPABILITY_NAME LIKE 'REFRESH%';
CAPABILITY_NAME P MSGTXT
------------------------------ - ------------------------------------------------------------------------
REFRESH_COMPLETE Y
REFRESH_FAST N
REFRESH_FAST_AFTER_INSERT N 不能满足嵌套实体化视图快速刷新的要求
REFRESH_FAST_AFTER_ONETAB_DML N 查看禁用 REFRESH_FAST_AFTER_INSERT 的原因
REFRESH_FAST_AFTER_ANY_DML N 查看禁用 REFRESH_FAST_AFTER_ONETAB_DML 的原因
REFRESH_FAST_PCT N PCT 不可能在实体化视图中的任何从表上
已选择6行。
--以上可知,用于复制的物化视图作为预计算物化视图的基表是不支持快速刷新的。
--看下面,建立完全刷新的物化视图则没有问题。
SQL> CREATE MATERIALIZED VIEW MV_FACT AS
2 SELECT F.ROWID F_ROWID, A.ROWID A_ROWID, B.ROWID B_ROWID, F.ID,
3 A.NAME A_NAME, B.NAME B_NAME, NUM
4 FROM FACT F, DIM_A A, DIM_B B
5 WHERE F.AID = A.ID
6 AND F.BID = B.ID;
实体化视图已创建。
以上可知,用于复制的物化视图作为预计算物化视图的基表是不支持快速刷新的,而建立完全刷新的物化视图则没有问题。
理解为什么这么做?在远程库中准备好数据然后刷到本地库中,在以上例子中,在oralife准备数据刷到remoteor下。
我的实例命名正好反了。
http://yangtingkun.itpub.net/post/468/207875