具有未知陈旧性的物化视图 - Oracle 11G

时间:2016-11-14 09:50:10

标签: oracle oracle11g materialized-views

我正在研究Oracle 11G 我的一个物化视图已变为UNKNOWN(MY_MAT_VW1)。您可以检查下面ALL_MVIEWS的输出。

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         |  

2 个答案:

答案 0 :(得分:1)

根据My Oracle Support,这可能是一个错误(7582462)。

由于没有解决此错误的方法,您必须处理陈旧性将显示unknown的事实,或者不使用物化视图定义上的函数。

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

答案 1 :(得分:1)

JSapkota 提到的Oracle Issue/Doc ID 757537.1明确指出,这不是错误,而是正确/预期的行为:

  

mview的STALENESS,引用PL / SQL函数设置为UNKOWN   因为无法确定PL / SQL函数的变化。目前的行为是   根据设计更正代码。

我想使用DETERMINISTIC函数而不是默认作用域可能会阻止它。