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
*
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提供的語法出錯的概率最小。