Oracle中具有快速刷新功能的实例化视图,而不是完成大量工作(&A)

2022-08-08 00:00:00 performance refresh oracle

我已经创建了一个具有这样的刷新完成的实例化视图,并且运行良好:

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;
现在我想创建一个类似的视图,但使用快速刷新,但它不起作用,它向我显示以下错误: error

知道我已经创建了对应表的日志,就像这样:

CREATE MATERIALIZED VIEW LOG ON contrat with rowid ;

解决方案

检查documentation:

快速刷新的一般限制

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

  • 实例化视图不得包含对SYSDATE和ROWNUM等非重复表达式的引用。

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

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

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

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

  • 不能包含MODEL子句。

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

  • 它不能包含具有ANY、ALL或不存在的嵌套查询。

  • 不能包含[以…开头]CONNECT BY子句。

  • 它不能包含不同站点的多个明细表。

  • 在提交实例化视图时不能有远程详细信息表。

  • 嵌套实例化视图必须具有联接或聚合。

  • 带有GROUP BY子句的实例化联接视图和实例化聚合视图不能从按索引组织的表中进行选择。

聚合实例化视图的快速刷新限制

使用聚合或联接为实例化视图定义查询具有 以下是对快速刷新的限制:

  • "快速刷新的一般限制"中的所有限制。
在提交时和按需时都支持快速刷新 实例化视图,但有以下限制:

  • 实例化视图中的所有表都必须有实体化视图日志,并且实例化视图日志必须:

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

      • 指定WITH ROWID并包含新值。

      • 如果希望表混合插入/直接加载、删除和更新,请指定SEQUENCE子句。

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

  • 必须指定count(*)。

  • 聚合函数只能作为表达式的最外层出现。即,诸如AVG(AVG(X))或AVG(X)+AVG(X)之类的聚集体 是不允许的。

  • 对于AVG(Expr)等每个聚合,必须存在相应的计数(Expr)。Oracle建议将SUM(EXPR)设置为 指定的。请参见将实例化视图与一起使用的要求 汇总以了解更多详细信息。

  • 如果指定VARIANCE(EXPR)或STDDEV(EXPR),则必须指定COUNT(EXPR)和SUM(EXPR)。Oracle建议将SUM(EXPR*EXPR) 指定的。请参见将实例化视图与一起使用的要求 汇总以了解更多详细信息。

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

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

  • 实例化视图不是基于一个或多个远程表。

    /li> 如果在实例化视图日志的筛选器列中使用CHAR数据类型,则主体站点和 实例化视图必须相同。

  • 如果实例化视图具有以下条件之一,则仅在传统DML插入和直接DML上支持快速刷新 加载。

    • 具有最小或最大聚合的实例化视图

    • 有和(Expr)但没有计数(Expr)的实例化视图

    • 不带计数的实例化视图(*)

    这样的实例化视图称为仅插入实例化视图。

  • 如果包含MAX或MIN的实例化视图没有WHERE子句,则在DELETE或MIXED DML语句后可以快速刷新该实例化视图。

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

  • 在FROM子句中包含命名视图或子查询的实例化视图可以快速刷新,前提是这些视图可以完全 合并了。有关合并哪些视图的信息,请参阅Oracle数据库 SQL优化指南。

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

  • 在常规DML和直接加载之后,具有外连接的实例化聚合视图是可快速刷新的,只要 外部表已修改。此外,唯一约束必须存在于 内联接表的联接列。如果有外部连接, 所有连接必须由AND连接,并且必须使用等号(=) 运算符。

  • 对于具有CUBE、ROLLUP、GROUPING SETS或它们的串联的实体化视图,适用以下限制:

      选择列表应包含分组识别符,它可以是所有GROUP BY表达式上的GROUPING_ID函数,也可以是 GROUPING函数用于每个GROUP BY表达式。例如,如果 实例化视图的GROUP BY子句是"GROUP BY CUBE(a,b)", 则选择列表应包含"GROUPING_ID(a,b)"或 "分组(A)和分组(B)"以使实例化视图更快 可刷新。

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

我想你错过了

  • 必须指定count(*)。
  • 对于AVG(Expr)等每个聚合,必须存在相应的计数(Expr)。
  • 指定WITH ROWID并包含新值。

  • 如果希望表混合插入/直接加载、删除和更新,请指定SEQUENCE子句。

相关文章