Oracle的物化视图复制的使用范围比较广,但是Oracle的官方文档中却很少建议将物化视图的复制用作数据仓库的数据抽取。
物化视图复制快速刷新的限制(一):http://yangtingkun.itpub.net/post/468/207875
Oracle中,复制物化视图作为预计算物化视图的基表是不支持快速刷新的。但是,复制物化视图作为复制物化视图的基表是可以快速刷新的。多级的物化视图复制就是利用了这个特性。在我曾经做过的例子中,只读物化视图复制达到了4层,仍然可以快速刷新。
预计算物化视图不能基于复制物化视图建立快速刷新,那么,能否直接对远端基表建立快速刷新的物化视图呢?
看下面的例子,这个例子的代码就建立在上面一章例子的基础之上。环境的搭建就不重复了,参考上一篇文章。
SQL> CONN TEST/TEST@TEST2已连接。
SQL> DROP MATERIALIZED VIEW MV_FACT;
实体化视图已删除。
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@YTK.YANGTINGKUN F, DIM_A@YTK.YANGTINGKUN A, DIM_B@YTK.YANGTINGKUN B
5 WHERE F.AID = A.ID
6 AND F.BID = B.ID;
AND F.BID = B.ID
*第 6 行出现错误:
ORA-12015: cannot create a fast refresh materialized view from a complex query
SQL> TRUNCATE TABLE MV_CAPABILITIES_TABLE;
表被截断。
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@YTK.YANGTINGKUN F, DIM_A@YTK.YANGTINGKUN A, DIM_B@YTK.YANGTINGKUN B
5 WHERE F.AID = A.ID
6 AND F.BID = B.ID');
7 END;
8 /
PL/SQL 过程已成功完成。
SQL> COL MSGTXT FORMAT A72SQL> 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 mv references a remote table or view in the FROM list
REFRESH_FAST_AFTER_INSERT N one or more joins present in mv
REFRESH_FAST_AFTER_ONETAB_DML N see the reason why REFRESH_FAST_AFTER_INSERT is disabled
REFRESH_FAST_AFTER_ANY_DML N see the reason why REFRESH_FAST_AFTER_ONETAB_DML is disabled
已选择6行。
这次的错误信息也很明显,对于预计算的物化视图,基表是不能包括远端表的。
IXDBA.NET技术社区那么就没有任何办法将预计算的物化视图快速刷新到远端了吗?也并不是没有办法,但是这个方法与建立预计算的初衷可能并不一致。那就是,在基表所在数据库建立快速刷新的预计算物化视图,在利用物化视图复制将预计算物化视图复制到远端数据库。
SQL> CONN YANGTK/YANGTK@YTK已连接。
SQL> DROP MATERIALIZED VIEW MV_FACT;
实体化视图已删除。
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> ALTER TABLE MV_FACT ADD PRIMARY KEY (F_ROWID, A_ROWID, B_ROWID);
表已更改。
SQL> CREATE MATERIALIZED VIEW LOG ON MV_FACT;
实体化视图日志已创建。
SQL> CONN TEST/TEST@TEST2已连接。
SQL> CREATE MATERIALIZED VIEW MV_MV_FACT REFRESH FAST AS
2 SELECT * FROM MV_FACT@YTK.YANGTINGKUN;
实体化视图已创建。
使用这个方法的缺点是大部分的工作量全部有基表所在站点承担,除了物化视图日志增加的负载,还包括了建立、刷新大量的预计算物化视图的负载,以及预计算物化视图日志的负载,而对于基表站点本身来说,预计算物化视图是没有实际的作用的。不过,这种方法毕竟解决了预计算物化视图不能快速刷新到远端站点的问题。如果基表所在数据库的负载较轻的话,是可以考虑这个方案的。