sql >> データベース >  >> RDS >> Oracle

MVがASNI結合を使用している場合、クエリの書き換えは失敗します

    理由を本当に説明することはできません 、しかし私はあなたに回避策をさせることができる観察をしました 問題。

    これがexplain_mviewの結果です クエリの場合 あなたのMV

    exec dbms_mview.explain_mview(q'[select A.y, B.z from A join B on A.x = B.x]');
    
    SELECT capability_name, possible, SUBSTR(related_text,1,8)
    AS rel_text, SUBSTR(msgtxt,1,60) AS msgtxt
    FROM MV_CAPABILITIES_TABLE
    WHERE capability_name   like '%REWRITE%'
    ORDER BY seq;
    
    CAPABILITY_NAME                P REL_TEXT MSGTXT                                                      
    ------------------------------ - -------- ------------------------------------------------------------
    REWRITE                        Y                                                                      
    REWRITE_FULL_TEXT_MATCH        Y                                                                      
    REWRITE_PARTIAL_TEXT_MATCH     Y                                                                      
    REWRITE_GENERAL                N          the reason why the capability is disabled has escaped analys
    REWRITE_PCT                    N          general rewrite is not possible or PCT is not possible on an
    

    問題は、REWRITE_GENERAL = 'N'のIMOです。

    同じexplain_mviewを繰り返す場合 POJOのみを使用 (=Oracleの単純な古い結合)別の結果が表示されます。

    truncate table mv_capabilities_table;
    exec dbms_mview.explain_mview(q'[select A.y, B.z from A, B where A.x = B.x]');
    
    CAPABILITY_NAME                P REL_TEXT MSGTXT                                                      
    ------------------------------ - -------- ------------------------------------------------------------
    REWRITE                        Y                                                                      
    REWRITE_FULL_TEXT_MATCH        Y                                                                      
    REWRITE_PARTIAL_TEXT_MATCH     Y                                                                      
    REWRITE_GENERAL                Y                                                                      
    REWRITE_PCT                    N          general rewrite is not possible or PCT is not possible on an
    PCT_TABLE_REWRITE              N A        relation is not a partitioned table                         
    PCT_TABLE_REWRITE              N B        relation is not a partitioned table
    

    ここでも重要な`REWRITE_GENERAL='Y'。

    私は18.4XEを使用していることに注意してください。これは非常に疑わしいため、Oracleサポートで明確にする必要があります。

    最後の良いニュース つまり、MVを定義した場合 Oraclejoinを使用 、ASNI結合を使用すると、書き換えが表示されます:

    create materialized view MV2 
      enable query rewrite
      as 
      select
        A.y, B.z from A, B where A.x = B.x
    
    EXPLAIN PLAN  SET STATEMENT_ID = 'jara1' into   plan_table  FOR
    select   A.y, B.z from A join B on A.x = B.x where y = 'A' and z = 'Z'
    ;
      
    SELECT * FROM table(DBMS_XPLAN.DISPLAY('plan_table', 'jara1','ALL'));
    
    -------------------------------------------------------------------------------------
    | Id  | Operation                    | Name | Rows  | Bytes | Cost (%CPU)| Time     |
    -------------------------------------------------------------------------------------
    |   0 | SELECT STATEMENT             |      |  3846 | 15384 |   456   (8)| 00:00:01 |
    |*  1 |  MAT_VIEW REWRITE ACCESS FULL| MV2  |  3846 | 15384 |   456   (8)| 00:00:01 |
    -------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
     
       1 - filter("MV2"."Z"='Z' AND "MV2"."Y"='A')
    



    1. グループ化された中央値の最良のアプローチ

    2. 単一のテーブルにある複数のファイルを別のテーブルの単一のフィールドにマップする戦略

    3. Oracle 10g PL/SQL-更新列の値として結果を選択します

    4. PHP:LOADDATAINFILE構文エラー