【问题标题】:Materialized View having UNKNOWN staleness - Oracle 11G具有未知陈旧性的物化视图 - Oracle 11G
【发布时间】:2017-03-27 22:03:27
【问题描述】:

我正在开发 Oracle 11G。
我的一个物化视图已变为未知(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 的信息。
它对存储在其中的数据是否有任何影响?
下面只是我为复制场景而创建的一个示例。

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         |  

【问题讨论】:

    标签: oracle oracle11g materialized-views


    【解决方案1】:
    JSapkota 提到的 Oracle Issue/Doc ID 757537.1 明确指出,这不是错误,而是正确/预期的行为:

    mview的STALENESS,指PL/SQL函数设置为UNKOWN 因为无法确定 PL/SQL 函数的更改。当前行为是 根据设计和代码正确。

    我猜想使用DETERMINISTIC 函数而不是默认范围可以防止它发生。

    【讨论】:

    • 我将通过使函数 DETERMINISTIC 进行检查并让您知道结果。
    • 我们目前有一些级联视图,但我在其中找不到自定义或非确定性 PL/SQL 函数(wm_concatnvlcoalesce 等除外)。所以UNKNOWNness 状态问题可能在其他地方
    • STALE_SINCE 似乎在数据库中的任何表(或结构)发生任何更改后立即设置为此类 matview,因为在 COMPLETE 刷新后它为空
    • 我正在使用一个函数,它根据使用 CASE 语句的某些规则连接特定实体的名称。该函数导致 UNKNOWN 陈旧。我尝试将函数转换为 DETERMINISTIC 但没有运气。
    • 即使对于 UNKNOWN staleness STALE_SINCE 列也会有 NULL 值
    【解决方案2】:

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

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

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

    【讨论】:

    • UNKNOWN staleness 是否存在数据差异?
    • Mview amy 工作正常,刷新没有问题,但陈旧显示UNKNOWN 状态。
    • Oracle 是否不信任我们的查询输出,为了更安全,它会将 Staleness 更新为 UNKNOWN。
    猜你喜欢
    • 2013-09-14
    • 2016-08-06
    • 2015-10-26
    • 2015-08-04
    • 2013-05-04
    • 2015-09-26
    • 2014-11-23
    • 2020-07-07
    • 1970-01-01
    相关资源
    最近更新 更多