Oracle
 sql >> база данни >  >> RDS >> Oracle

Пренаписването на заявката е неуспешно, ако MV използва ASNI Join

Не мога да обясня защо , но направих наблюдение, което може да ви накара да заобиколно решение проблемът.

Ето резултата от 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

Проблемът е IMO в REWRITE_GENERAL = 'N'

Ако повторите същия 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.4 XE и това е много подозрително и трябва да се изясни с поддръжката на Oracle.

Последните добри новини е, ако дефинирате MV с съединяването на Oracle , можете да използвате 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Оракул с подзаявка

  2. SQLDeveloper не показва таблици под връзки, където пише таблици

  3. Oracle SQL Developer - Грешка:ключовата дума FROM не е намерена, където се очаква

  4. Колко лошо е игнорирането на Oracle DUP_VAL_ON_INDEX изключение?

  5. Оракул. Липсваща ключова дума при използване на оператор за регистър. Грешка 00905