转载自:http://yangtingkun.itpub.net/post/468/13318

物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新。因此快速刷新是物化视图刷新方式的首选。

但是快速刷新具有较多的约束,而且对于采用ON COMMIT模式进行快速刷新的物化视图更是如此。对于包含聚集和包含连接的物化视图的快速刷新机制并不相同,而且对于多层嵌套的物化视图的快速刷新更是有额外的要求。

如此多的限制一般很难记全,当建立物化视图失败时,Oracle给出的错误信息又过于简单,有时无法使你准确定位到问题的原因。

Oracle提供的DBMS_MVIEW.EXPLAIN_MVIEW过程可以帮助你快速定位问题的原因。下面通过一个例子来说明,如果通过这个过程来解决问题。

建立一个快速刷新的嵌套物化视图:

SQL> CREATE TABLE B (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> CREATE TABLE C (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));

表已创建。

SQL> CREATE TABLE A (ID NUMBER, BID NUMBER, CID NUMBER, NUM NUMBER, 
  2  CONSTRAINT FK_A_B_BID FOREIGN KEY (BID) REFERENCES B(ID), 
  3  CONSTRAINT FK_A_C_BID FOREIGN KEY (CID) REFERENCES C(ID));

表已创建。

SQL> INSERT INTO B SELECT ROWNUM, 'B'||ROWNUM FROM USER_TABLES WHERE ROWNUM <= 6;

已创建6行。

SQL> INSERT INTO C SELECT ROWNUM, 'C'||ROWNUM FROM USER_TABLES WHERE ROWNUM <= 4;

已创建4行。

SQL> INSERT INTO A SELECT ROWNUM, TRUNC((ROWNUM - 1)/2) + 1, TRUNC((ROWNUM - 1)/3) + 1, ROWNUM 
  2  FROM USER_TABLES
  3  WHERE ROWNUM <= 12;

已创建12行。

SQL> COMMIT;

提交完成。

上面建立好基表,下面建立第一层物化视图。

SQL> CREATE MATERIALIZED VIEW LOG ON A WITH ROWID;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW LOG ON B WITH ROWID;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW LOG ON C WITH ROWID;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW MV_ABC REFRESH FAST ON COMMIT ENABLE QUERY REWRITE AS
  2  SELECT C.ID CID, C.NAME CNAME, B.ID BID, B.NAME BNAME, A.NUM, 
  3  A.ROWID AROWID, B.ROWID BROWID, C.ROWID CROWID 
  4  FROM A, B, C WHERE A.BID = B.ID AND A.CID = C.ID;

实体化视图已创建。

第一次物化视图已经建立成功,下面建立嵌套物化视图:

SQL> CREATE MATERIALIZED VIEW LOG ON MV_ABC WITH ROWID (BNAME, CNAME, NUM) INCLUDING NEW VALUES;

实体化视图日志已创建。

SQL> CREATE MATERIALIZED VIEW MV_MV_ABC REFRESH FAST ON COMMIT ENABLE QUERY REWRITE AS
  2  SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC
  3  GROUP BY CNAME, BNAME;
SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC
                                                           *
ERROR 位于第 2 行:
ORA-12053: 这不是一个有效的嵌套实体化视图

错误出现了,不过错误的描述包含的信息量并不大。我们看看Oracle的文档上是如何描述这个错误的。

ORA-12053 this is not a valid nested materialized view

Cause: The list of objects in the FROM clause of the definition of this materialized view had some dependencies upon each other.

Action: Refer to the documentation to see which types of nesting are valid.

文档上的描述也是十分笼统的,并没有指出具体问题所在。

接下来,我们通过使用DBMS_MVIEW.EXPLAIN_MVIEW过程来定位错误。

使用EXPLAIN_MVIEW过程首先要建立MV_CAPABILITIES_TABLE表,建表的脚步是$ORACLE_HOME/rdbms/admin/utlxmv.sql。(EXPLAIN_MVIEW过程是两个过程的重载,一个输出到MV_CAPABILITIES_TABLE表,另一个以PL/SQL的VARRAY格式输出,为了简单起见,我们建立MV_CAPABILITIES_TABLE表)。

SQL> @?rdbmsadminutlxmv.sql

表已创建。

下面简单研究一下EXPLAIN_MVIEW过程。

DBMS_MVIEW.EXPLAIN_MVIEW(mv IN VARCHAR2, Statement_id IN VARCHAR2:= NULL);

该过程可以输入已经存在的物化视图名称(或USER_NAME.MV_NAME),也可输入建立物化视图的查询语句。另外一个参数STATEMENT_ID输入一个语句ID,为了标识出表中对应的记录。

SQL> BEGIN
  2  DBMS_MVIEW.EXPLAIN_MVIEW('SELECT CNAME, BNAME, COUNT(*) COUNT, SUM(NUM) SUM_NUM FROM MV_ABC 
  3  GROUP BY CNAME, BNAME', 'MV_MV_ABC');
  4  END;
  5  /

PL/SQL 过程已成功完成。

SQL> SELECT CAPABILITY_NAME, RELATED_TEXT, MSGTXT FROM MV_CAPABILITIES_TABLE
  2  WHERE STATEMENT_ID = 'MV_MV_ABC' AND POSSIBLE = 'N' AND CAPABILITY_NAME NOT LIKE '%PCT%';

CAPABILITY_NAME                RELATED_TEXT    MSGTXT
------------------------------ --------------- --------------------------------------------------
REFRESH_FAST_AFTER_ONETAB_DML  SUM_NUM         使用 SUM(expr) 时, 未提供 COUNT(expr)
REFRESH_FAST_AFTER_ANY_DML     YANGTK.MV_ABC   mv 日志没有序列号
REFRESH_FAST_AFTER_ANY_DML                     查看禁用 REFRESH_FAST_AFTER_ONETAB_DML 的原因

根据上面的信息,已经可以确定问题的原因了,对于聚集物化视图,使用了SUM(COLUMN),但是没有包括COUNT(COLUMN)。

修改物化视图,重新建立:

SQL> CREATE MATERIALIZED VIEW MV_MV_ABC REFRESH FAST ON COMMIT ENABLE QUERY REWRITE AS
  2  SELECT CNAME, BNAME, COUNT(*) COUNT, COUNT(NUM) NUM_COUNT, SUM(NUM) SUM_NUM FROM MV_ABC
  3  GROUP BY CNAME, BNAME;

实体化视图已创建。

定位导致物化视图无法快速刷新的原因相关推荐

  1. Oracle 如何根据物化视图日志快速刷新物化视图 (不积跬步,无以至千里)

    Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构: SQL ...

  2. oracle12c视图刷新,12c 物化视图 - 对快速刷新的理解

    前一篇博客用一个简单的示例描述了完全刷新的物化视图.完全刷新的物化视图每次刷新都需要对保存数据的基表执行delete操作,在将新的结果集insert到基表.为了减少这个开销,为了减少这个开销Oracl ...

  3. oracle 物化视图的自动刷新方法

    oracle 物化视图的自动刷新方法: 方法1,直接在创建的时候,指定start with ,如下代表每分钟执行1次 create materialized view big_table_mv nol ...

  4. mysql 物化视图 更新_物化视图的快速刷新测试与物化视图日志

    前言:一般在创建物化视图的时候,在数据量不大的时候,刷新的方式都是采用完全刷新的.随着系统的使用一些物化视图的源表的数据量在不断的增长,原本采用完全方式几秒就能刷新完成的物化视图,现在需要等待很久的时 ...

  5. 物化视图是否可以exp导出_物化视图导出导入可能导致物化视图日志的失效

    SQL> create user yang identified by yang; 用户已创建. 已用时间:  00: 00: 00.10 SQL> grant resource,conn ...

  6. 数据库链、物化视图、高级复制方面

    数据库链相关内容: JOB自动执行出错,但手工执行正常--浅谈job和database link的一个特点 :描述了匿名数据库链的特点,以及和JOB配合使用时会出现的情况. 通过数据库链执行DDL语句 ...

  7. 物化视图的刷新方式说明

    2019独角兽企业重金招聘Python工程师标准>>> 物化视图可以选择三种不同的刷新方式,根据不同的需求,选择不同的刷新方式. Complete刷新:会删除表中的所有记录(如果是单 ...

  8. 数据库 物化视图详解

    物化视图 物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照.物化视图可以基于表查询,视图和其它的物化视 ...

  9. oracle 物化视图、中间表的方案

    物化视图 有个项目因为有比较多的查询汇总,考虑到速度,所以使用了物化视图.简单的把用到的给整理了下.先看简单创建语句: create materialized view mv_materialized ...

最新文章

  1. java窗口坐标_如何在Java中获取窗口外部的鼠标单击坐标
  2. Normal Equations 的由来与推导
  3. 拖链电缆 机器人电缆_选购电缆拖链需要注意哪些要点
  4. 【五】每个球队胜率统计
  5. 《Android 应用案例开发大全(第二版)》——导读
  6. 全面整理(随时更新)
  7. 数据安全_个人信息查询
  8. 点燃乌镇,三星已重返战场!国行版Galaxy S10最高售价10999元...
  9. h5 宽度全屏自适应
  10. 渤海银行天津分行计算机笔试,关于渤海银行笔试经验分享
  11. 已知三角形顶点坐标,求其外接圆的公式
  12. Ubuntu 20.04 + mysql 8.0.27 用户名和密码修改(非常实用)
  13. 一个大学老师的2020
  14. typec耳机知识介绍-数字耳机,模拟耳机
  15. FSL安装教程(Ubuntu)
  16. Mac使用技巧:快捷键也可清理Safari浏览数据!
  17. 机器学习极简入门课程
  18. ssm+jsp计算机毕业设计CheatEngine学习系统4i3k0(程序+LW+源码+远程部署)
  19. 台媒:台积电预计在台湾新竹建设使用2纳米制程的工厂
  20. 三十、元素的显示与隐藏

热门文章

  1. 【GIF动画+完整可运行源代码】C++实现 插入排序——十大经典排序算法之三
  2. Dev-Cpp 常用的快捷键(持续更新)
  3. 中学计算机老师的英语,中学计算机老师的路在何方?
  4. 聚合链路出现Destination host unreachable
  5. 如何自动修复XP/VISTA/WIN7系统引导的工具(NTBootAutofix 2.02)
  6. Java连接SQL2005及SQL Server JDBC Driver 2.0中sqljdbc.jar和sqljdbc4.jar的区别
  7. 开发html5单页用什么框架,GitHub - mmcai/single-page-react-h5: 基于React框架的单页活动框架,可以基于此代码上进行相关的H5活动等相关内容的开发...
  8. esxi安装openwrt_双软路由安装——ROS安装、上网、DNS缓存、常用设置(小白教程)...
  9. putty 连接虚拟机_使用Putty连接虚拟机
  10. 台安变频器n2按键说明_台安N2变频器说明书.pdf