以前写过一篇文章,介绍了两种情况无法进行快速刷新,今天ITPUB上有人问起这个问题。
ITPUB原贴:http://www.itpub.net/thread-1317638-1-1.html
两个导致物化视图无法快速刷新的问题:http://yangtingkun.itpub.net/post/468/38548
其实上一篇文章的最后已经点出了解决方法。下面通过一个简单的例子来说明这个问题:
SQL> CREATE TABLE T_BASE (ID NUMBER, NAME VARCHAR2(30));
表已创建。
SQL> CREATE TABLE T_FACT (ID NUMBER, FID NUMBER, NAME VARCHAR2(30));
表已创建。
SQL> ALTER TABLE T_BASE ADD PRIMARY KEY (ID);
表已更改。
SQL> ALTER TABLE T_FACT ADD PRIMARY KEY (ID);
表已更改。
SQL> ALTER TABLE T_FACT ADD CONSTRAINT FK_FACT_FID FOREIGN KEY (FID) REFERENCES T_BASE(ID);
表已更改。
SQL> CREATE MATERIALIZED VIEW LOG ON T_BASE
2 WITH ROWID, SEQUENCE
3 INCLUDING NEW VALUES;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T_FACT
2 WITH ROWID, SEQUENCE (FID)
3 INCLUDING NEW VALUES;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW MV_FACT_BASE
2 REFRESH FAST
3 AS SELECT F.ROWID ROWID_F,
4 B.ROWID ROWID_B,
5 F.NAME NAME_F,
6 B.NAME NAME_B
7 FROM T_BASE B, T_FACT F
8 WHERE B.ID = F.FID;
实体化视图已创建。
其实下面最简单的方法是通过VIEW来实现两个字段的合并:
SQL> CREATE VIEW V_FACT_BASE
2 (ROWID_B, ROWID_F, NAME) AS
3 SELECT ROWID_B,
4 ROWID_F,
5 NAME_F || NAME_B
6 FROM MV_FACT_BASE;
视图已创建。
当然,如果愿意,完全可以通过嵌套一层物化视图来实现:
SQL> CREATE MATERIALIZED VIEW LOG ON MV_FACT_BASE
2 WITH ROWID, SEQUENCE (ROWID_B, ROWID_F, NAME_B, NAME_F)
3 INCLUDING NEW VALUES;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW MV_COMBINE
2 REFRESH FAST AS
3 SELECT ROWID_B, ROWID_F, NAME_F || NAME_B NAME, COUNT(*) COUNT
4 FROM MV_FACT_BASE
5 GROUP BY ROWID_B, ROWID_F, NAME_F || NAME_B;
实体化视图已创建。
这种方式通过物化视图实现了最终的结果,不过代价相对比较大,个人更倾向于第一种方式用视图来实现这个功能。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-666197/ ,如需转载,请注明出处,否则将追究法律责任。