【问题标题】:Materialized view is not showing up in plan table output from explain plan statement spool?解释计划语句假脱机的计划表输出中未显示物化视图?
【发布时间】:2021-08-07 15:34:08
【问题描述】:

我在 SH2 上创建了一个物化视图,但是当我运行我的解释计划语句时,我看不到计划表输出中正在使用的物化视图。我不确定它是否是一个更复杂的物化视图,带有额外的键列来连接到其他维度,所以我有点困惑为什么没有使用物化视图,因为我在我的选择中引用了 SH2 前缀查询。

CREATE MATERIALIZED VIEW fweek_pscat_sales_mv
PCTFREE 5
BUILD IMMEDIATE
REFRESH COMPLETE
ENABLE QUERY REWRITE
AS
SELECT   t.week_ending_day
,        p.prod_subcategory
,        sum(s.amount_sold) AS Money
,        s.channel_id
,        s.promo_id
FROM     sales s
,        times t
,        products p
WHERE    s.time_id = t.time_id
AND      s.prod_id = p.prod_id
GROUP BY t.week_ending_day
,        p.prod_subcategory
,        s.channel_id
,        s.promo_id;

CREATE BITMAP INDEX FW_PSC_S_MV_SUBCAT_BIX  
ON fweek_pscat_sales_mv(prod_subcategory);

CREATE BITMAP INDEX FW_PSC_S_MV_CHAN_BIX
ON fweek_pscat_sales_mv(channel_id);

CREATE BITMAP INDEX FW_PSC_S_MV_PROMO_BIX   
ON fweek_pscat_sales_mv(promo_id);

CREATE BITMAP INDEX FW_PSC_S_MV_WD_BIX
ON fweek_pscat_sales_mv(week_ending_day);
spool &data_dir.EXP_query_on_SH2_2.txt

alter session set query_rewrite_integrity = TRUSTED;
alter session set query_rewrite_enabled = TRUE;

set timing on

EXPLAIN PLAN FOR
SELECT   t.week_ending_day
,        p.prod_subcategory
,        sum(s.amount_sold) AS Money
,        s.channel_id
,        s.promo_id
FROM     SH2.sales s
,        SH2.times t
,        SH2.products p
WHERE    s.time_id = t.time_id
AND      s.prod_id = p.prod_id
GROUP BY t.week_ending_day
,        p.prod_subcategory
,        s.channel_id
,        s.promo_id;

REM Now Let us Display the Output of the Explain Plan
SET pagesize 9999
set linesize 250
set markup html preformat on
select * from table(dbms_xplan.display());
set linesize 80

spool off
----------------------------------------------------------------------------------------------------------------------------------
| Id  | Operation                      | Name                    | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     | Pstart| Pstop |
----------------------------------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT               |                         |  1016K|    60M|       | 17365   (1)| 00:00:01 |       |       |
|   1 |  HASH GROUP BY                 |                         |  1016K|    60M|    70M| 17365   (1)| 00:00:01 |       |       |
|*  2 |   HASH JOIN                    |                         |  1016K|    60M|       |  2178   (1)| 00:00:01 |       |       |
|   3 |    VIEW                        | index$_join$_003        | 10000 |   224K|       |    74   (0)| 00:00:01 |       |       |
|*  4 |     HASH JOIN                  |                         |       |       |       |            |          |       |       |
|   5 |      INDEX FAST FULL SCAN      | PRODUCTS_PK             | 10000 |   224K|       |    41   (0)| 00:00:01 |       |       |
|   6 |      INDEX FAST FULL SCAN      | PRODUCTS_PROD_SUBCAT_IX | 10000 |   224K|       |    51   (0)| 00:00:01 |       |       |
|*  7 |    HASH JOIN                   |                         |  1016K|    37M|       |  2101   (1)| 00:00:01 |       |       |
|   8 |     PART JOIN FILTER CREATE    | :BF0000                 |  1016K|    37M|       |  2101   (1)| 00:00:01 |       |       |
|   9 |      TABLE ACCESS FULL         | TIMES                   |  1461 | 23376 |       |    13   (0)| 00:00:01 |       |       |
|  10 |     PARTITION RANGE JOIN-FILTER|                         |  1016K|    22M|       |  2086   (1)| 00:00:01 |:BF0000|:BF0000|
|  11 |      TABLE ACCESS FULL         | SALES                   |  1016K|    22M|       |  2086   (1)| 00:00:01 |:BF0000|:BF0000|
----------------------------------------------------------------------------------------------------------------------------------

【问题讨论】:

    标签: oracle plsql oracle11g data-warehouse


    【解决方案1】:

    您为什么希望从基线查询中引用 MV。为此,Oracle 必须将查询与所有 MV 进行比较才能找到匹配项。更进一步,它需要将每个查询与每个 MV 进行比较。创建 MV 通常是为了避免通过直接访问 MV 来运行基线查询(这就是为什么 MV 是查询的存储结果)。如果你想要MV,直接从中选择即可。

    SELECT  week_ending_day                                                                                                    
         ,  prod_subcategory                                                                                                   
         ,  Money                                                                                                              
         ,  channel_id                                                                                                         
         ,  promo_id                                                                                                           
      from fweek_pscat_sales_mv;
    
                                                                                               
    

    【讨论】:

    • 我希望它会被重写。尝试检查 DBMS_MVIEW.EXPLAIN_REWRITE
    猜你喜欢
    • 1970-01-01
    • 2019-08-12
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多