2017-05-04 91 views
4

問題很簡單。 我創建TableFather和TableChild通過外鍵鏈接。 我爲兩者創建了物化視圖日誌。 我使用快速刷新創建實體化視圖,作爲從TableFather到TableChild的左連接。ORACLE:物化視圖上的快速刷新在某些情況下不能與OUTER JOIN配合使用

結果是

  1. 添加子記錄,物化視圖刷新
  2. 修改子字段,物化視圖刷新
  3. 添加一個父親的記錄,物化視圖不會刷新

這是代碼

-- Tables 
CREATE TABLE TABLE_FATHER (
    ID NUMBER(10, 0), 
    TEXT NVARCHAR2(50), 
    CONSTRAINT PK__TABLE1 PRIMARY KEY (ID) 
); 

CREATE TABLE TABLE_CHILD (
    ID  NUMBER(10, 0), 
    TEXT  NVARCHAR2(50), 
    ID_FATHER NUMBER(10, 0), 
    CONSTRAINT PK__TABLE2 PRIMARY KEY (ID), 
    CONSTRAINT FK_TABLE_FATHER FOREIGN KEY (ID_FATHER) 
    REFERENCES TABLE_FATHER (ID) 
); 

-- Some record before materialized view creation 
INSERT INTO TABLE_FATHER(ID, TEXT) VALUES(1, 'father1'); 
INSERT INTO TABLE_CHILD(ID, TEXT, ID_FATHER) VALUES(1, 'child1', 1); 
INSERT INTO TABLE_CHILD(ID, TEXT, ID_FATHER) VALUES(2, 'child2', 1); 

-- Logs 
CREATE MATERIALIZED VIEW LOG on TABLE_FATHER WITH PRIMARY KEY, ROWID; 
CREATE MATERIALIZED VIEW LOG on TABLE_CHILD WITH PRIMARY KEY, ROWID; 

-- Materialized View 
CREATE MATERIALIZED VIEW TABLE_MV 
REFRESH FAST ON COMMIT 
AS 
SELECT TABLE_FATHER.ID ID_FATHER, 
     TABLE_FATHER.TEXT TEXT_FATHER, 
     TABLE_CHILD.ID ID_CHILD, 
     TABLE_CHILD.TEXT TEXT_CHILD, 
     TABLE_FATHER.ROWID FATHER_ROWID, 
     TABLE_CHILD.ROWID CHILD_ROWID 
    FROM TABLE_FATHER, 
     TABLE_CHILD 
    WHERE TABLE_FATHER.ID = TABLE_CHILD.ID_FATHER (+); 

在這一點上,你可以驗證,第一個結果

INSERT INTO TABLE_CHILD(ID, TEXT, ID_FATHER) VALUES(3, 'child3', 1); 
COMMIT; 
SELECT * FROM TABLE_MV; 

然後第二個結果

UPDATE TABLE_CHILD SET TEXT = 'child33' WHERE ID = 3; 
COMMIT; 
SELECT * FROM TABLE_MV; 

然後第三個結果

INSERT INTO TABLE_FATHER(ID, TEXT) VALUES(2, 'father2'); 
COMMIT; 
SELECT * FROM TABLE_MV; 

正如你所看到的,物化視圖不刷新最後一種情況。我猜可能是什麼問題,但我想先看看你的解釋。我希望我做錯了什麼,它不是一種MView限制問題。我正在研究Oracle 11g版本11.2.0.1.0。太多的幫助

+0

如果手動刷新MV,會發生什麼情況:exec dbms_mview.refresh('TABLE_MV','F');另外,檢查記錄是否在mv日誌中:alter materialized view table_mv按需快速刷新; *更新/插入table_father *;從mlog $ _table_father中選擇*; –

+0

我無法在11.2.0.3或12.1.0.2上重現您的問題。複製/粘貼您的確切測試。 –

+0

快速手動刷新不起作用。完整的手動刷新效果很好。 MLOG $ _table_father已正確填充,然後在手動刷新後清除。 – kinghomer

回答

3

據到My Oracle Support

謝謝 - 我發現的Bug 8856349:OUTER快速刷新聯接物化視圖不起作用

的Bug在11.2.0.1證實,固定於11.2.0.2基地釋放。

的MOS記說,解決辦法是:

設置參數 「_mv_refresh_pkfk_relationship_opt」=假。然而

alter system set "_mv_refresh_pkfk_relationship_opt"=false scope=both; 

,因爲這是一個隱藏的參數,我想無論是諮詢Oracle支持(如果你有機會),以任何可能的副作用:

您可以通過以下改變這個參數設置此參數,或者先徹底測試物化視圖在測試系統上刷新到生產系統之前先刷新。

+0

我發現了!值爲TRUE。是否可以通過pl/sql修改這個隱藏的參數?你知道我必須執行哪個查詢嗎?非常感謝您的幫助。不幸的是我沒有訪問MOS – kinghomer

+0

@kinghomer我已經編輯瞭如何更改init參數(特別是這個)的答案。 –

+0

好的。現在修改參數,使用外連接快速刷新。非常感謝 – kinghomer

相關問題