ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 基于复制的多层嵌套快速刷新物化视图

基于复制的多层嵌套快速刷新物化视图

原创 Linux操作系统 作者:yangtingkun 时间:2010-07-03 23:59:43 0 删除 编辑

基于复制的快速刷新物化视图可以包含多层嵌套的查询,这里给出一个简单的例子。

 

 

基于复制的物化视图一般满足两个条件,表级复制且源表和目标表不在同一个数据库上。

所谓的表级复制是指,基于复制的物化视图不会包含聚集函数,也不会通过连接使得物化视图包含两张或更多的表的字段。

而这种物化视图也可以包含连接查询,但是连接方式是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/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: RAT手册
请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1964
  • 访问量
    11077259