Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zapytanie Rewrite nie powiedzie się, jeśli MV używa ASNI Join

Naprawdę nie potrafię wyjaśnić, dlaczego , ale poczyniłem spostrzeżenie, które może skłonić Cię do obejścia problem.

Oto wynik explain_mview dla zapytania Twojego 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

Problemem jest IMO w REWRITE_GENERAL = 'N'

Jeśli powtórzysz to samo explain_mview tylko przy użyciu POJO (=zwykłe stare połączenie w Oracle) zobaczysz inny wynik.

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

Ponownie ważne `REWRITE_GENERAL ='Y'.

Pamiętaj, że używam 18.4 XE i jest to bardzo podejrzane i powinno zostać wyjaśnione w Oracle Support.

Ostateczna dobra wiadomość jest, jeśli zdefiniujesz MV dzięki dołączeniu Oracle , możesz użyć przyłączenia ASNI i zobaczysz przepisanie:

Przykład

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle Database Enforce CHECK na wielu tabelach

  2. Wydrukuj tekst w oknie arkusza roboczego Oracle SQL Developer SQL

  3. odpowiednik `pokaż utwórz tabelę` w Oracle sql

  4. Wyniki funkcji dekodowania Oracle w różnych formatach

  5. JSON_QUERY() Funkcja w Oracle