問題は単純です。 外部キーでリンクされた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;
次に2番目の結果
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 Release 11.2.0.1.0に取り組んでいます。私のオラクルのサポートによると
ずっとあなたの助け
MVを手動で更新するとどうなりますか?exec dbms_mview.refresh( 'TABLE_MV'、 'F');また、レコードがmvログに含まれているかどうかを確認してください:マテリアライズド・ビューの変更table_mv要求時の高速リフレッシュ。 *更新/挿入table_father *; mlog $ _table_fatherから*を選択します。 –
11.2.0.3または12.1.0.2で問題を再現できません。あなたの正確なテストをコピー/ペーストします。 –
高速手動リフレッシュが機能しません。完全な手動リフレッシュがうまくいきます。 MLOG $ _table_fatherが正しく入力され、手動更新後にパージされます。 – kinghomer