1. 程式人生 > >oracle物化檢視連線查詢注意事項

oracle物化檢視連線查詢注意事項

發現對於REFRESHFAST ON COMMIT物化檢視,並不支援標準外連線的寫法,而Oracle特有的(+)方式則沒有問題。

Oracle對於標準外聯接的寫法支援的並不好,類似的bug已經不是第一次碰到了。

SQL> CREATE TABLE T_P (ID NUMBERPRIMARY KEY, NAME VARCHAR2(30));

表已建立。

SQL> CREATE TABLE T_F (ID NUMBERPRIMARY KEY, FID NUMBER);

表已建立。

SQL> CREATE MATERIALIZED VIEWLOG ON T_P
  2 WITH ROWID (ID);

實體化檢視日誌已建立。

SQL> CREATE MATERIALIZED VIEWLOG ON T_F
  2  WITH ROWID (FID);

實體化檢視日誌已建立。

SQL> CREATE MATERIALIZED VIEWMV_T_ORACLE
  2  REFRESH FAST ON COMMIT
  3  AS SELECT A.ROWID A_RID, B.ROWID B_RID, A.ID,FID, NAME
  4  FROM T_P A, T_F B
  5  WHERE A.ID = FID (+);

實體化檢視已建立。

SQL> CREATE MATERIALIZED VIEWMV_T_STARDAND
  2  REFRESH FAST ON COMMIT
  3  AS SELECT A.ROWID A_RID, B.ROWID B_RID, A.ID,FID, NAME
  4  FROM T_P A LEFT JOIN T_F B
  5  ON A.ID = FID;
FROM T_P A LEFT JOIN T_F B
*

第 4 行出現錯誤:
ORA-12054: 無法為實體化檢視設定 ON COMMIT 重新整理屬性


SQL> CREATE MATERIALIZED VIEW MV_T_STARDAND
  2  REFRESH FAST
  3  AS SELECT A.ROWID A_RID, B.ROWID B_RID, A.ID,FID, NAME
  4  FROM T_P A LEFT JOIN T_F B
  5  ON A.ID = FID;
FROM T_P A LEFT JOIN T_F B
*
第 4 行出現錯誤:
ORA-12015: 不能從複雜查詢中建立一個可快速重新整理的實體化檢視


SQL> CREATE MATERIALIZED VIEW MV_T_STARDAND
  2  REFRESH FAST
  3  AS SELECT A.ROWID A_RID, B.ROWID B_RID, A.ID,FID, NAME
  4  FROM T_P A INNER JOIN T_F B
  5  ON A.ID = FID;
FROM T_P A INNER JOIN T_F B
*
第 4 行出現錯誤:
ORA-12015: 不能從複雜查詢中建立一個可快速重新整理的實體化檢視

從上面的物化檢視建立語句不難看出,Oracle並非不支援外聯接的方式,採用(+)方式建立的物化檢視是可以成功的,但是如果採用了標準SQL方式,不要說ON COMMIT方式,或者包含外聯接了,就是普通內連線建立快速重新整理的物化檢視仍然會出現錯誤。

所以問題的根源還是標準寫法,既然使用的是Oracle資料庫,還是使用Oracle提供的語法出錯的概率最小。