oracle中的物化视图与快速刷新而不是完全不起作用

时间:2018-03-30 17:44:14

标签: oracle performance refresh

我创建了一个物理化视图,其中像这样刷新完成,并且效果很好:

CREATE MATERIALIZED VIEW VM4 
   Build immediate 
   refresh complete on commit 
AS 
select C.codecomp, 
    count(c.numpolice) as NbContrat, 
    SUM(c.montant) as MontantGlobal 
from contrat C  
group by c.codecomp;

现在我想创建一个类似的视图,但使用Refresh Fast但它不起作用,它显示了这个错误: error

知道我已经创建了Contrat表的日志:

CREATE MATERIALIZED VIEW LOG ON contrat with rowid ;

1 个答案:

答案 0 :(得分:0)

检查documentation

  

快速刷新的一般限制

     

物化视图的定义查询限制如下:

     
      
  • 实体化视图不得包含对非重复表达式(如SYSDATE和ROWNUM)的引用。

  •   
  • 实体化视图不得包含对RAW或LONG RAW数据类型的引用。

  •   
  • 它不能包含SELECT列表子查询。

  •   
  • 它不能在SELECT子句中包含分析函数(例如,RANK)。

  •   
  • 它不能引用定义了XMLIndex索引的表。

  •   
  • 它不能包含MODEL子句。

  •   
  • 它不能包含带子查询的HAVING子句。

  •   
  • 它不能包含具有ANY,ALL或NOT EXISTS的嵌套查询。

  •   
  • 它不能包含[START WITH ...] CONNECT BY子句。

  •   
  • 它不能在不同的站点包含多个详细信息表。

  •   
  • ON COMMIT物化视图不能包含远程详细信息表。

  •   
  • 嵌套的物化视图必须具有连接或聚合。

  •   
  • 具有GROUP BY子句的物化连接视图和具体化聚合视图无法从索引组织表中进行选择。

  •   
     

使用聚合在物化视图上快速刷新的限制

     

使用聚合或联接定义具体化视图的查询   快速刷新的以下限制:

     
      
  • "快速刷新的一般限制"。
  • 的所有限制   
     

ON COMMIT和ON DEMAND都支持快速刷新   物化视图,但以下限制适用:

     
      
  • 物化视图中的所有表必须具有物化视图日志,物化视图日志必须:

         
        
    • 包含物化视图中引用的表中的所有列。

           
          
      • 使用ROWID指定并包含新值。

      •   
      • 如果预计表格会混合插入/直接加载,删除和更新,请指定SEQUENCE子句。

      •   
    •   
  •   
  • 仅支持SUM,COUNT,AVG,STDDEV,VARIANCE,MIN和MAX进行快速刷新。

  •   
  • 必须指定COUNT(*)。

  •   
  • 聚合函数必须仅作为表达式的最外层部分。也就是说,AVG(AVG(x))或AVG(x)+ AVG(x)等聚合   是不允许的。

  •   
  • 对于AVG(expr)等每个聚合,必须存在相应的COUNT(expr)。 Oracle建议使用SUM(expr)   指定。请参阅使用实体化视图的要求   聚合以获取更多详细信息。

  •   
  • 如果指定了VARIANCE(expr)或STDDEV(expr),则必须指定COUNT(expr)和SUM(expr)。 Oracle建议使用SUM(expr * expr)   指定。请参阅使用实体化视图的要求   聚合以获取更多详细信息。

  •   
  • 定义查询中的SELECT列不能是包含多个基表的列的复杂表达式。有可能   解决方法是使用嵌套的物化视图。

  •   
  • SELECT列表必须包含所有GROUP BY列。

  •   
  • 物化视图不基于一个或多个远程表。

  •   
  • 如果在物化视图日志的过滤列中使用CHAR数据类型,则主站点的字符集和   物化视图必须相同。

  •   
  • 如果物化视图具有以下之一,则仅在常规DML插入和直接支持时才支持快速刷新   负荷。

         
        
    • 具有MIN或MAX聚合的物化视图

    •   
    • 具有SUM(expr)但没有COUNT(expr)的物化视图

    •   
    • 没有COUNT(*)

    • 的物化视图   
         

    这种物化视图称为仅插入物化视图。

  •   
  • 如果没有WHERE子句,删除或混合DML语句后,具有MAX或MIN的物化视图可快速刷新。

         

    删除或混合DML后的最大/最小快速刷新与仅插入案例的行为不同。它删除并重新计算   受影响组的最大/最小值。你需要注意   它的性能影响。

  •   
  • 如果视图可以完全刷新,则可以快速刷新具有FROM子句中的命名视图或子查询的实体化视图   合并。有关将合并哪些视图的信息,请参阅Oracle数据库   SQL调优指南。

  •   
  • 如果没有外连接,您可以在WHERE子句中进行任意选择和连接。

  •   
  • 具有外连接的物化聚合视图在传统DML和直接加载后可快速刷新,仅提供   外表已被修改。此外,必须存在唯一约束   内连接表的连接列。如果有外连接,   所有连接必须通过AND连接,并且必须使用相等(=)   操作

  •   
  • 对于使用CUBE,ROLLUP,分组集或连接的实体化视图,以下限制适用:

         
        
    • SELECT列表应包含分组识别符,它可以是所有GROUP BY表达式上的GROUPING_ID函数或   GROUPING为每个GROUP BY表达式运行一个。例如,如果   物化视图的GROUP BY子句是" GROUP BY CUBE(a,b)",   那么SELECT列表应该包含" GROUPING_ID(a,b)"要么   "分组(a)和分组(b)"物化视图要快   刷新。

    •   
    • GROUP BY不应导致任何重复分组。例如," GROUP BY a,ROLLUP(a,b)"因为它不能快速刷新   导致重复分组"(a),(a,b),和(a)"。

    •   
  •   

我想你错过了

  • 必须指定COUNT(*)。
  • 对于AVG(expr)等每个聚合,必须存在相应的COUNT(expr)。
  • 使用ROWID指定并包含新值。

  • 如果预计表格会混合插入/直接加载,删除和更新,请指定SEQUENCE子句。