【问题标题】:Oracle Database - MV Fast refresh, referencing viewOracle 数据库 - MV 快速刷新、引用视图
【发布时间】:2020-02-27 00:54:48
【问题描述】:

我有几个关于创建快速刷新的物化视图的问题。问题是我需要在查询计数(*)函数中,这对于快速刷新是非法的。我在某处读到我制作了一个“帮助”视图,它将执行 count()。我想从我的物化视图中引用该视图。刷新时,完整的工作正常,但在尝试快速执行期间,出现 ORA 12004 错误。我知道我需要来自我引用的表的物化视图日志,但是视图呢?如何创建它们?在引用视图中使用 count() 是否也是非法的?如何为该视图创建一个 ROWID 列?如果使用 count() 是非法的,尽管创建表来制作它,还有其他方法吗?

【问题讨论】:

    标签: sql database oracle view materialized


    【解决方案1】:

    您当然可以在fast refresh 物化视图中拥有count

    create table t (
      c1 int primary key,
      c2 int
    );
    
    insert into t 
      select level, mod ( level, 3 )  
      from   dual
      connect by level <= 10;
    
    commit;
    
    create materialized view log on t
      with rowid, primary key ( c2 )
      including new values;
    
    create materialized view mv
    refresh fast on commit 
    as 
      select c2, count (*)
      from   t
      group  by c2;
    
    select * from mv;
    
    C2     COUNT(*)   
        1           4 
        2           3 
        0           3 
    
    insert into t 
      select -level, mod ( level, 3 )  
      from   dual
      connect by level <= 10;
    
    commit;
    
    select * from mv;
    
    C2     COUNT(*)   
        1           8 
        2           6 
        0           6 
    

    如果您无法使实体化视图快速刷新并且您不确定原因,请查看dbms_mview.explain_mview。这给出了可能的刷新的细分,以及它们是否可能用于 MV。

    对于那些不可能的,有一个简短的解释原因:

    create table mv_capabilities_table (
      statement_id      varchar(30) ,
      mvowner           varchar(30) ,
      mvname            varchar(30) ,
      capability_name   varchar(30) ,
      possible          character(1) ,
      related_text      varchar(2000) ,
      related_num       number ,
      msgno             integer ,
      msgtxt            varchar(2000) ,
      seq               number
    ) ;
    
    exec dbms_mview.explain_mview('mv');
    select capability_name, possible, msgtxt from MV_CAPABILITIES_TABLE
    where  capability_name like 'REFRESH%';
    
    CAPABILITY_NAME                  POSSIBLE    MSGTXT                                                                     
    REFRESH_COMPLETE                 Y           <null>                                                                      
    REFRESH_FAST                     Y           <null>                                                                      
    REFRESH_FAST_AFTER_INSERT        Y           <null>                                                                      
    REFRESH_FAST_AFTER_ONETAB_DML    Y           <null>                                                                      
    REFRESH_FAST_AFTER_ANY_DML       Y           <null>                                                                      
    REFRESH_FAST_PCT                 N           PCT is not possible on any of the detail tables in the materialized view    
    

    如果您在物化视图中使用视图,则需要在视图使用的表上创建 MV 日志。

    【讨论】:

    • 我创建了该表,得到的答案是:“禁用该功能的原因已逃脱分析”。
    • 答案是什么?
    猜你喜欢
    • 2011-10-20
    • 1970-01-01
    • 2015-06-13
    • 2013-06-28
    • 1970-01-01
    • 2013-12-04
    • 2019-07-24
    • 2018-09-04
    • 2016-12-11
    相关资源
    最近更新 更多