2016-11-14 56 views
1

我正在致力於Oracle 11G。
其中一個物化視圖已成爲UNKNOWN(MY_MAT_VW1)。您可以檢查下面的ALL_MVIEWS的輸出。具有UNKNOWN陳舊性的物化視圖 - Oracle 11G

OWNER | MVIEW_NAME | CONTAINER_NAME | QUERY | QUERY_LEN | UPDATABLE | UPDATE_LOG | MASTER_ROLLBACK_SEG | MASTER_LINK | REWRITE_ENABLED | REWRITE_CAPABILITY | REFRESH_MODE  | REFRESH_METHOD  | BUILD_MODE | FAST_REFRESHABLE | LAST_REFRESH_TYPE | LAST_REFRESH_DATE | STALENESS  | AFTER_FAST_REFRESH | UNKNOWN_PREBUILT | UNKNOWN_PLSQL_FUNC | UNKNOWN_EXTERNAL_TABLE | UNKNOWN_CONSIDER_FRESH | UNKNOWN_IMPORT | UNKNOWN_TRUSTED_FD | COMPILE_STATE | USE_NO_INDEX | STALE_SINCE | NUM_PCT_TABLES | NUM_FRESH_PCT_REGIONS | NUM_STALE_PCT_REGIONS 
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
MY_DB | MY_MAT_VW1 | MY_MAT_VW1  | select.. | 6728  | N   |   |      |    | N    | GENERAL   | DEMAND   | COMPLETE   | IMMEDIATE | NO    | COMPLETE   | 14-Nov-16   | UNKNOWN   | NA     | N     | Y     | N      | N      | N    | N     | VALID   | N    | 0   |    |      | 
MY_DB | MY_MAT_VW2 | MY_MAT_VW2  | select.. | 7074  | N   |   |      |    | N    | TEXTMATCH   | DEMAND   | COMPLETE   | IMMEDIATE | NO    | COMPLETE   | 13-Nov-16   | FRESH   | NA     | N     | N     | N      | N      | N    | N     | FRESH   | N    | 0   | 0    |      | 

的物化視圖的查詢包含複雜的多表,內聯的意見和工會之間的連接。
根據我的理解(UNKNOWN_PLSQL_FUNC列)我猜有一個PLSQL函數導致陳舊程度變爲UNKNOWN。但是我不確定哪一個。
我試圖重新編譯和刷新它,但沒有運氣。
任何人都可以提供一些關於如何檢測根本原因的信息,並確保它不會再次變爲UNKNOWN。
也有它存儲在其中的數據的任何含義?
以下只是我爲複製該場景而創建的示例。

SELECT * FROM ENTITY_T; 

ID | ENTITY_TYPE | FIRST_NAME | LAST_NAME | LEGAL_NAME 
-------------------------------------------------- 
1 | INDIVIDUAL | JOHN  | LESSEN | 
2 | INDIVIDUAL | ROSAN  | MEL  | 
3 | CORP  | SIGMA  |   | SIGMA CORPORATION 


--Function to get name base upon type 
CREATE OR REPLACE FUNCTION GET_NAME (P_ID IN NUMBER) 
RETURN VARCHAR2 
DETERMINISTIC 
AS 
LV_NAME VARCHAR2(200); 
BEGIN 
SELECT CASE ENTITY_TYPE WHEN 'INDIVIDUAL' THEN FIRST_NAME ||' '|| LAST_NAME 
         WHEN 'CORP' THEN LEGAL_NAME 
         ELSE 'NONE' 
     END INTO LV_NAME 
FROM ENTITY_T 
WHERE ID=P_ID; 
RETURN LV_NAME; 
EXCEPTION 
WHEN NO_DATA_FOUND THEN 
    RETURN 'NO ID FOUND'; 
WHEN OTHERS THEN 
    RETURN 'OTHER ERROR'; 
END; 

--Materialized view creation 
CREATE MATERIALIZED VIEW TEST_MV 
AS 
SELECT ID,ENTITY_TYPE,GET_NAME(ID) NAME 
FROM ENTITY_T; 


SELECT MVIEW_NAME,STALENESS,AFTER_FAST_REFRESH,UNKNOWN_PLSQL_FUNC,COMPILE_STATE,STALE_SINCE 
FROM ALL_MVIEWS WHERE MVIEW_NAME='TEST_MV'; 

MVIEW_NAME | STALENESS | AFTER_FAST_REFRESH | UNKNOWN_PLSQL_FUNC | COMPILE_STATE | STALE_SINCE 
---------------------------------------------------------------------------------------------- 
TEST_MV | UNKNOWN | NA     | Y     | VALID   | 

回答

1

通過JSapkota提到狀態顯然,這是不是一個錯誤,但正確/預期的行爲甲骨文Issue/Doc ID 757537.1

的MVIEW的陳舊程度,指的PL/SQL函數設置爲UNKOWN ,因爲無法確定PL/SQL函數更改。當前的行爲是 正確的設計&代碼。

我想用DETERMINISTIC函數代替默認範圍可以防止它。

+0

我將通過使用DETERMINISTIC函數進行檢查並讓您知道結果。 – hemalp108

+0

我們目前有一些級聯視圖,但是我找不到一個自定義或非確定性的PL/SQL函數(除了'wm_concat','nvl','coalesce'等等)。所以'UNKNOWN''狀態問題可能在其他地方 –

+0

''STALE_SINCE'似乎是爲這樣的matview設置的,只要數據庫中的任何表(或結構)有任何改變,因爲它在'COMPLETE'後是空的刷新 –

1

根據My Oracle Support的說法,這可能是一個錯誤(7582462)。

由於這個錯誤沒有解決方案,因此您必須處理陳舊性將顯示unknown的事實,或者不使用實例化視圖定義上的函數。

參考:DBA_MVIEWS Shows STALENESS Value of UNKNOWN After Refresh (Doc ID 757537.1)

+0

UNKNOWN陳舊性能有任何數據差異嗎? – hemalp108

+0

Mview艾米工作正常,刷新沒有問題,但陳舊顯示'UNKNOWN'狀態。 – JSapkota

+0

它是否像甲骨文不相信我們的查詢輸出,並在更安全的一面更新陳舊爲未知。 – hemalp108