sql >> データベース >  >> RDS >> Oracle

ORACLE:LEFTJOINを使用するとマテリアライズドビューが機能しない

    マテリアライズド・ビューを高速にリフレッシュするには、満たされない2つの条件があります。 1つ目は、関係するすべてのテーブルのROWID列を指定しなかったことです。 2つ目は、文書化されていない制限です。ANSI結合はサポートされていません。

    これは、DEPTがtable_1、エイリアスa、EMPがtable_2、エイリアスbの例です。

    SQL> create materialized view log on emp with rowid
      2  /
    
    Materialized view log created.
    
    SQL> create materialized view log on dept with rowid
      2  /
    
    Materialized view log created.
    
    SQL> create materialized view empdept_mv
      2    refresh fast on commit
      3  as
      4  select a.deptno
      5    from dept a
      6         left join emp b on (a.deptno = b.deptno)
      7  /
      from dept a
           *
    ERROR at line 5:
    ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
    

    それはあなたの状況を模倣しています。最初にROWIDを追加します:

    SQL> create materialized view empdept_mv
      2    refresh fast on commit
      3  as
      4  select a.rowid dept_rowid
      5       , b.rowid emp_rowid
      6       , a.deptno
      7    from dept a
      8         left join emp b on (a.deptno = b.deptno)
      9  /
      from dept a
           *
    ERROR at line 7:
    ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view
    

    それでも、ANSIが参加しているため、高速更新はできません。古いスタイルの外部結合構文への変換:

    SQL> create materialized view empdept_mv
      2    refresh fast on commit
      3  as
      4  select a.rowid dept_rowid
      5       , b.rowid emp_rowid
      6       , a.deptno
      7    from dept a
      8       , emp b
      9   where a.deptno = b.deptno (+)
     10  /
    
    Materialized view created.
    

    そしてそれが機能することを証明するために:

    SQL> select * from empdept_mv
      2  /
    
    DEPT_ROWID         EMP_ROWID              DEPTNO
    ------------------ ------------------ ----------
    AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAA         20
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAB         30
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAC         30
    AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAD         20
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAE         30
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAF         30
    AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAG         10
    AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAH         20
    AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAI         10
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAJ         30
    AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAK         20
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAL         30
    AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAM         20
    AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAN         10
    AAARhmAAEAAAAI/AAD                            40
    
    15 rows selected.
    
    SQL> insert into dept values (50,'IT','UTRECHT')
      2  /
    
    1 row created.
    
    SQL> commit
      2  /
    
    Commit complete.
    
    SQL> select * from empdept_mv
      2  /
    
    DEPT_ROWID         EMP_ROWID              DEPTNO
    ------------------ ------------------ ----------
    AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAA         20
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAB         30
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAC         30
    AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAD         20
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAE         30
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAF         30
    AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAG         10
    AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAH         20
    AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAI         10
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAJ         30
    AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAK         20
    AAARhmAAEAAAAI/AAC AAARhlAAEAAAAI3AAL         30
    AAARhmAAEAAAAI/AAB AAARhlAAEAAAAI3AAM         20
    AAARhmAAEAAAAI/AAA AAARhlAAEAAAAI3AAN         10
    AAARhmAAEAAAAI/AAD                            40
    AAARhmAAEAAAAI7AAA                            50
    
    16 rows selected.
    

    ANSI結合構文の制限は、これのポイント6で説明されています。ブログ投稿

    よろしく、ロブ。



    1. PHP、PythonでのMysqlIN句のパラメータ化

    2. Pythonの問題:vcvarsall.batが見つかりません

    3. NHibernateQueryOver-結果が多すぎるコレクション

    4. trustCertificateKeyStoreUrlとclientCertificateKeyStoreUrl