2017-05-04 25 views
4

問題は単純です。 外部キーでリンクされたTableFatherとTableChildを作成します。 両方に対してマテリアライズド・ビュー・ログを作成します。 TableFatherからTableChildへの左結合として高速リフレッシュを使用してマテリアライズド・ビューを作成します。ORACLE:一部の条件でOUTER JOINでマテリアライズド・ビューが高速リフレッシュされない

結果が表示子フィールドを変更

  • リフレッシュされるマテリアライズド、ビューは父親のレコードを追加
  • リフレッシュされるマテリアライズド、ビューが
  • に更新されていないマテリアライズド、子レコードを追加する

    1. です

      これはコードです

      -- 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に取り組んでいます。私のオラクルのサポートによると

      ずっとあなたの助け

    +0

    MVを手動で更新するとどうなりますか?exec dbms_mview.refresh( 'TABLE_MV'、 'F');また、レコードがmvログに含まれているかどうかを確認してください:マテリアライズド・ビューの変更table_mv要求時の高速リフレッシュ。 *更新/挿入table_father *; mlog $ _table_fatherから*を選択します。 –

    +0

    11.2.0.3または12.1.0.2で問題を再現できません。あなたの正確なテストをコピー/ペーストします。 –

    +0

    高速手動リフレッシュが機能しません。完全な手動リフレッシュがうまくいきます。 MLOG $ _table_fatherが正しく入力され、手動更新後にパージされます。 – kinghomer

    答えて

    3

    のためのおかげで - 私はバグ8856349を見つけた:OUTERの高速リフレッシュは、ビューが11.2.0.2で修正された11.2.0.1で確認

    バグを、動作しないマテリアライズド・ジョインベースリリース。

    パラメータ "_mv_refresh_pkfk_relationship_opt" = falseを設定し

    MOS・ノートでは、回避策はにあることを述べています。

    あなたは以下を経由して、このパラメータを変更することができます。

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

    しかし、これは隠しパラメータであるとして(あなたがアクセス権を持っている場合)、私は任意の潜在的な副作用にとして、Oracleサポートに相談しますどちらかこのパラメータを設定するか、テストシステムでマテリアライズドビューのリフレッシュを完全にテストしてから、プロダクションシステムに展開してください。

    +0

    私はそれを見つけました!値はTRUEです。 pl/sql経由でこの隠しパラメータを変更することは可能でしょうか?私は実行する必要があるクエリを知っていますか?あなたの助けをありがとう。残念ながら私はMOSへのアクセスがありません – kinghomer

    +0

    @kinghomer私は、initパラメータ(と特にこれを変更する方法と答えを編集しました)。 –

    +0

    パラメータの変更、外部結合を使った高速リフレッシュがうまくいきました。どうもありがとう – kinghomer

    関連する問題