基於複製的多層巢狀快速重新整理物化檢視

yangtingkun發表於2010-07-03

基於複製的快速重新整理物化檢視可以包含多層巢狀的查詢,這裡給出一個簡單的例子。

 

 

基於複製的物化檢視一般滿足兩個條件,表級複製且源表和目標表不在同一個資料庫上

所謂的表級複製是指,基於複製的物化檢視不會包含聚集函式,也不會透過連線使得物化檢視包含兩張或更多的表的欄位。

而這種物化檢視也可以包含連線查詢,但是連線方式是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部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-667121/,如需轉載,請註明出處,否則將追究法律責任。

相關文章