Sql 在物化视图中重新写入查询,定义查询具有';联合所有';在甲骨文中

Sql 在物化视图中重新写入查询,定义查询具有';联合所有';在甲骨文中,sql,oracle,materialized-views,Sql,Oracle,Materialized Views,我正在尝试一些关于物化视图(mViews)的训练,以便确定是否可以使用mViews来提高查询执行的性能 作为此活动的一部分,我们创建了以下mView CREATE MATERIALIZED VIEW v2mv_fast_accunion12 BUILD IMMEDIATE refresh fast start WITH sysdate next (sysdate + 1) ENABLE QUERY REWRITE AS SELECT 1 AS marker,d.OPERATINGA

我正在尝试一些关于物化视图(mViews)的训练,以便确定是否可以使用mViews来提高查询执行的性能

作为此活动的一部分,我们创建了以下mView

CREATE MATERIALIZED VIEW v2mv_fast_accunion12
 BUILD IMMEDIATE
 refresh fast  start WITH sysdate next (sysdate + 1)
 ENABLE QUERY REWRITE
AS
   SELECT 1 AS marker,d.OPERATINGAIRLINECODE,d.FFPPROGRAM,d.ACCRUALPOSTINGSTATUS,
   NULL  AS tot_records,b.RECEIVERALERTCODE receiver_alert,b.SENDERALERT sender_alert,
   a.ROWID ra,b.ROWID rb,c.ROWID rc,d.ROWID rd
 FROM PAI_FILE A ,  PAI_VALID_ACCRUAL B,pai_file c,pai_valid_accrual d
 WHERE a.file_id= b.file_id AND
 c.file_id = d.file_id
 AND a.filetype=1
 AND c.filetype=2
 AND b.transactionid=d.transactionid

 UNION ALL

SELECT 2 AS marker,b.OPERATINGAIRLINECODE,b.FFPPROGRAM,b.ACCRUALPOSTINGSTATUS,b.file_id AS tot_records,
b.RECEIVERALERTCODE receiver_alert,b.SENDERALERT sender_alert,a.ROWID ra,b.ROWID rb,NULL AS rc,NULL AS rd
FROM   pai_file a,pai_valid_accrual b
WHERE a.file_id=b.file_id
AND
a.filetype=1
 ;
已创建物化视图。创建的mView的功能如下

MV_REPORT

Capable of: 

  REFRESH_COMPLETE

  REFRESH_FAST

  REFRESH_FAST_AFTER_INSERT

  REFRESH_FAST_AFTER_ONETAB_DML

  REFRESH_FAST_AFTER_ANY_DML
然后,我试图使查询重写为下面的查询工作

SELECT  OPERATINGAIRLINECODE OPE,FFPPROGRAM FFP,
COUNT(TOTALNUMBEROFRECORDS) TOTALNUMBEROFRECORDS,
SUM(ACCRUAL_01) ACCRUAL_01,SUM(ACCRUAL_03) ACCRUAL_03,
COUNT( REJECT_HUB) REJECT_HUB,SUM(ACCRUAL_02) ACCRUAL_02,
SUM(Alertedbyhub) Alertedbyhub
FROM ( 
   SELECT d.OPERATINGAIRLINECODE,d.FFPPROGRAM, NULL  AS TOTALNUMBEROFRECORDS ,
CASE WHEN d.ACCRUALPOSTINGSTATUS = '01' THEN 1 ELSE 0 END ACCRUAL_01,
CASE WHEN d.ACCRUALPOSTINGSTATUS = '03' THEN 1 ELSE 0 END ACCRUAL_03,
NULL AS REJECT_HUB,
CASE WHEN d.ACCRUALPOSTINGSTATUS = '02' THEN 1 ELSE 0 END ACCRUAL_02,
 NULL AS  Alertedbyhub  
 FROM PAI_FILE A ,  PAI_VALID_ACCRUAL B,pai_file c,pai_valid_accrual d
 WHERE a.file_id= b.file_id AND
 c.file_id = d.file_id
 AND a.filetype=1
 AND c.filetype=2
 AND a.RECEIVED_DATE BETWEEN To_Date('20150101 00:00:00','YYYYMMDD HH24:MI:SS') AND To_Date('20150130 23:59:59','YYYYMMDD HH24:MI:SS')
 AND b.transactionid=d.transactionid
 AND d.accrualpostingstatus IN ('01','02','03')
 AND d.OPERATINGAIRLINECODE IN ('AB')

 UNION ALL 


SELECT b.OPERATINGAIRLINECODE,b.FFPPROGRAM,b.file_id TOTALNUMBEROFRECORDS,
NULL AS ACCRUAL_01,NULL AS ACCRUAL_03,NULL AS REJECT_HUB,NULL AS ACCRUAL_02,
CASE WHEN b.RECEIVERALERTCODE IS NOT NULL OR b.SENDERALERT         IS NOT NULL THEN 1 ELSE 0 END Alertedbyhub
FROM   pai_file a,pai_valid_accrual b
WHERE a.file_id=b.file_id
AND
a.filetype=1
AND a.RECEIVED_DATE BETWEEN To_Date('20150101 00:00:00','YYYYMMDD HH24:MI:SS') AND To_Date('20150130 23:59:59','YYYYMMDD HH24:MI:SS')
AND b.OPERATINGAIRLINECODE IN ('AB')

UNION ALL 

SELECT B.OPERATINGAIRLINECODE,B.FFPPROGRAM,NULL AS TOTALNUMBEROFRECORDS,NULL AS ACCRUAL_01,
NULL AS ACCRUAL_03,b.rejected_accrual_id REJECT_HUB,NULL AS ACCRUAL_02,
NULL AS Alertedbyhub
FROM  pai_file a,pai_rejected_accrual b
WHERE a.file_id = b.file_id
AND A.RECEIVED_DATE BETWEEN To_Date('20150101 00:00:00','YYYYMMDD HH24:MI:SS') AND To_Date('20150130 23:59:59','YYYYMMDD HH24:MI:SS')
AND b.OPERATINGAIRLINECODE IN ('AB')

) WHERE (OPERATINGAIRLINECODE IS NOT NULL AND  FFPPROGRAM IS NOT NULL) GROUP BY OPERATINGAIRLINECODE,FFPPROGRAM;
在上面的查询中,我希望第一个和第二个联合查询子集使用创建的mView

已检查查询的解释计划。但它不是通过查询重写使用mView

下面是查询的解释计划

----------------------------------------------------------------------------------------------------------
| Id  | Operation                 | Name                 | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
----------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT          |                      |  1146 | 50424 |       |  1116K  (1)| 03:43:13 |
|   1 |  HASH GROUP BY            |                      |  1146 | 50424 |       |  1116K  (1)| 03:43:13 |
|   2 |   VIEW                    |                      |  6958K|   291M|       |  1115K  (1)| 03:43:10 |
|   3 |    UNION-ALL              |                      |       |       |       |            |          |
|*  4 |     HASH JOIN             |                      |  2453K|   198M|  2432K|   646K  (1)| 02:09:23 |
|*  5 |      TABLE ACCESS FULL    | PAI_FILE             | 88658 |  1385K|       |  1102   (1)| 00:00:14 |
|*  6 |      HASH JOIN            |                      |  3945K|   259M|   116M|   630K  (1)| 02:06:07 |
|*  7 |       HASH JOIN           |                      |  2220K|    91M|       |   458K  (1)| 01:31:46 |
|*  8 |        TABLE ACCESS FULL  | PAI_FILE             | 86013 |   671K|       |  1099   (1)| 00:00:14 |
|*  9 |        TABLE ACCESS FULL  | PAI_VALID_ACCRUAL    |  3680K|   122M|       |   457K  (1)| 01:31:32 |
|  10 |       INDEX FAST FULL SCAN| ACCRUAL_IDX7         |    52M|  1295M|       | 71813   (1)| 00:14:22 |
|* 11 |     HASH JOIN             |                      |  4500K|   133M|  2432K|   467K  (1)| 01:33:30 |
|* 12 |      TABLE ACCESS FULL    | PAI_FILE             | 88658 |  1385K|       |  1102   (1)| 00:00:14 |
|* 13 |      TABLE ACCESS FULL    | PAI_VALID_ACCRUAL    |  7237K|   103M|       |   456K  (1)| 01:31:24 |
|* 14 |     HASH JOIN             |                      |  4672 |   132K|       |  1546   (1)| 00:00:19 |
|* 15 |      TABLE ACCESS FULL    | PAI_REJECTED_ACCRUAL |  4672 | 74752 |       |   442   (1)| 00:00:06 |
|* 16 |      TABLE ACCESS FULL    | PAI_FILE             |   359K|  4561K|       |  1102   (1)| 00:00:14 |
----------------------------------------------------------------------------------------------------------
使用“union all”将查询重写为工作状态,我是否遗漏了什么

以这种方式使用mView的方法是否正确?请推荐我


提前谢谢

您可以检查为什么不使用它,有一些因素会影响这一点

但是DBMS_MVIEW.EXPLAIN_REWRITE过程建议是否可以对查询进行查询重写,如果可以,将使用哪些物化视图。它还解释了为什么不能重写查询

有关如何使用此功能的更多信息,您可以找到