基于复制的快速刷新物化视图可以包含多层嵌套的查询,这里给出一个简单的例子。
基于复制的物化视图一般满足两个条件,表级复制且源表和目标表不在同一个数据库上。
所谓的表级复制是指,基于复制的物化视图不会包含聚集函数,也不会通过连接使得物化视图包含两张或更多的表的字段。
而这种物化视图也可以包含连接查询,但是连接方式是EXISTS方式。
此外还要求所有的表建立物化视图日志,且物化视图日志包含主键列、所有连接列和所有的过滤列。
看一个包含3层嵌套子查询的例子:
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 NAME VARCHAR2(30),
5 CONSTRAINT FK_T2_FID FOREIGN KEY (FID)
6 REFERENCES T1(ID));
表已创建。
SQL> CREATE TABLE T3
2 (ID NUMBER PRIMARY KEY,
3 TYPE VARCHAR2(30));
表已创建。
SQL> CREATE TABLE T4
2 (ID NUMBER PRIMARY KEY,
3 FID_T2 NUMBER,
4 FID_T3 NUMBER,
5 CONSTRAINT FK_T4_T2 FOREIGN KEY (FID_T2)
6 REFERENCES T2(ID),
7 CONSTRAINT FK_T4_T3 FOREIGN KEY (FID_T3)
8 REFERENCES T3(ID));
表已创建。
SQL> CREATE INDEX IND_T2_FID ON T2(FID);
索引已创建。
SQL> CREATE INDEX IND_T4_FID_T2 ON T4(FID_T2);
索引已创建。
SQL> CREATE INDEX IND_T4_FID_T3 ON T4(FID_T3);
索引已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T1;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T2 WITH (FID);
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T3 WITH (TYPE);
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW LOG ON T4 WITH (FID_T2, FID_T3);
实体化视图日志已创建。
SQL> INSERT INTO T1
2 SELECT ROWNUM, TNAME
3 FROM TAB;
已创建28行。
SQL> INSERT INTO T2
2 SELECT ROWNUM, MOD(ROWNUM, 2) + 1, TNAME
3 FROM TAB;
已创建28行。
SQL> INSERT INTO T3
2 SELECT ROWNUM, TYPE
3 FROM (SELECT DISTINCT OBJECT_TYPE TYPE
4 FROM ALL_OBJECTS);
已创建37行。
SQL> INSERT INTO T4
2 SELECT ROWNUM, T2.ID, T3.ID
3 FROM T2, T3;
已创建1036行。
SQL> COMMIT;
提交完成。
下面在目标站点可以建立物化视图:
SQL> CREATE DATABASE LINK TESTZJ
2 CONNECT TO TEST
3 IDENTIFIED BY TEST
4 USING '172.25.13.231/TESTZJ';
Database link created.
SQL> SELECT * FROM GLOBAL_NAME@TESTZJ;
GLOBAL_NAME
--------------------------------------------------------------------------------
TESTZJ
SQL> CREATE MATERIALIZED VIEW MV_T1234
2 REFRESH FAST AS
3 SELECT *
4 FROM T1@TESTZJ
5 WHERE EXISTS
6 (SELECT 1
7 FROM T2@TESTZJ
8 WHERE T1.ID = T2.FID
9 AND EXISTS
10 (SELECT 1
11 FROM T4@TESTZJ
12 WHERE FID_T2 = T2.ID
13 AND EXISTS
14 (SELECT 1
15 FROM T3@TESTZJ
16 WHERE T3.ID = FID_T3
17 AND TYPE = 'TABLE')));
Materialized view created.
EXISTS子查询不仅可以像例子中存在一对多和多对一的关系,甚至还支持多对多的关系。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-667121/ ,如需转载,请注明出处,否则将追究法律责任。