物化视图使用手册(二)

葛文余,现就职于北京海天起点技术服务股份有限公司,专家组成员,从业8年以上,在数据库领域有丰富的实践经验。 主要涉及金融、电信、制造业等核心系统运维经验,获得11g OCM、12c OCM、MySQL OCP、Exadata、Goldengate等相关技术认证,擅长高可用、高性能数据库的部署实施、 故障诊断、性能优化等工作。

快速刷新的物化视图

物化视图快速刷新的能力

并不是所有的物化视图都能够快速刷新,物化视图的快速刷新受到各种因素的制约。有些物化视图我们可以通过调整,使其实现快速,但也有一些物化视图即使再调整也无法实现快速刷新。物化视图的快速刷新能力有如下几种情况:

  • NO – 不支持快速刷新,只能全量刷新;
  • DML -只支持常规DML操作,不支持直接路径加载操作的快速刷新。这一类物化视图通常是通过远程数据库链接创建的物化视图;
  • DIRLOAD -只支持直接路径装载操作的快速刷新,该类型目前还没有见过。
  • DIRLOAD_DML -支持常规DML操作和直接装载操作的快速刷新
  • DIRLOAD_LIMITEDDML -支持部分DML操作和直接装载操作的快速刷新,通常是只支持插入操作的快速刷新,对于删除、更新操作却无法实现快速刷新。

判断物化视图能否快速刷新

判断一个物化视图能否快速刷新有三种方式:
  • 最简单的方法就是尝试快速刷新操作。可以使用这种方式在测试环境创建该物化视图时验证其能够快速刷新之后,在正式使用。
  • 查询数据字典USER_MVIEWS,其中的FAST_REFRESHABLE字段反应了该物化视图的快速刷新能力。
  • 还可以通过一个过程来深入了解物化视图的快速刷新及查询重写能力。之前3.7节中提到的DBMS_MVIEW.EXPLAIN_MVIEW过程。使用该过程需要提前在当前用户下创建一个mv_capabilities_table表,该表通过以下脚本来创建:

    使用该过程的方法如下:

    该过程的参数为物化视图的名字和一个标识符,该标识用于在mv_capabilities_table表中查找到相关的记录

不能快速刷新的原因总结

  • 基表没有创建物化视图日志,或者记录的字段不全。为了实现快速刷新,物化视图日志通常需要记录查询语句涉及到的所有字段(单表简单查询除外)。
  • 当物化视图中包含对不重复表达式或者特殊数据类型的引用时无法实现快速刷新,不重复表达式如:SYSDATE和ROWNUM;特殊数据类型如:LONG和LONG RAW.
  • 只包含连接的物化视图,需要在创建时指定连接表的rowid,相应的基表也要建立包含rowid的物化视图日志。如果使用外连接,where条件也要受限制。当包含外连接时,WHERE语句中只能使用AND连接,并且只能使用”=”操作。下面是一个只包含内连接,且能够实现快速刷新的物化视图:

  • 包含聚合函数的物化视图,在查询中需要指定count(*) 字段,如果在查询中出现了sum(col)或者avg(col)这样的列,那么count(col)列也必须存在。如果没有count(col)列则无法实现快速刷新,如果没有count(*) 列,则通常只能实现DIRLOAD_LIMITEDDML方式的快速刷新。下面是一个确实count(*)列的例子:

  • 包含group by语句的物化视图,group by后面的字段必须全部出现在select语句之后。否则无法实现快速刷新。
  • 当union all 出现在物化视图创建语句中时,各部分语句都要能够实现单独的快速刷新,并且每个部分都不能包含max,min聚合函数。
  • 物化视图针对View或者索引组织表查询时,无法实现快速刷新。

以上是到目前为止,我总结的所有影响快速刷新的因素。除此之前应该还有更多的影响物化视图快速刷新的因素有待于我们去了解。

使用Oracle的建议实现快速刷新

Oracle提供了一项功能,可以指导我们实现物化视图的快速刷新。但该功能有时候并不是那么靠谱。并不能对所有物化视图的快速刷新提供解决方案。所以我们需要结合上面的知识来补充该工具的不足。另外该工具给出的建议有时候也需要我们人为的修改才能形成最终的解决方案。该工具的使用方法如下。

该过程运行成功后,我们可以通过如下方法,得到oracle的建议以实现快速刷新:

 



未经允许不得转载:Oracle一体机用户组 » 物化视图使用手册(二)

相关推荐