問題很簡單。 我創建TableFather和TableChild通過外鍵鏈接。 我爲兩者創建了物化視圖日誌。 我使用快速刷新創建實體化視圖,作爲從TableFather到TableChild的左連接。ORACLE:物化視圖上的快速刷新在某些情況下不能與OUTER JOIN配合使用
結果是
- 添加子記錄,物化視圖刷新
- 修改子字段,物化視圖刷新
- 添加一個父親的記錄,物化視圖不會刷新
這是代碼
-- 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。太多的幫助
如果手動刷新MV,會發生什麼情況:exec dbms_mview.refresh('TABLE_MV','F');另外,檢查記錄是否在mv日誌中:alter materialized view table_mv按需快速刷新; *更新/插入table_father *;從mlog $ _table_father中選擇*; –
我無法在11.2.0.3或12.1.0.2上重現您的問題。複製/粘貼您的確切測試。 –
快速手動刷新不起作用。完整的手動刷新效果很好。 MLOG $ _table_father已正確填充,然後在手動刷新後清除。 – kinghomer