定位导致物化视图无法快速刷新的原因
转载自: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;
实体化视图已创建。
定位导致物化视图无法快速刷新的原因相关推荐
- Oracle 如何根据物化视图日志快速刷新物化视图 (不积跬步,无以至千里)
Oracle物化视图的快速刷新机制是通过物化视图日志完成的.Oracle如何通过一个物化视图日志就可以支持多个物化视图的快速刷新呢,本文简单的描述一下刷新的原理. 首先,看一下物化视图的结构: SQL ...
- oracle12c视图刷新,12c 物化视图 - 对快速刷新的理解
前一篇博客用一个简单的示例描述了完全刷新的物化视图.完全刷新的物化视图每次刷新都需要对保存数据的基表执行delete操作,在将新的结果集insert到基表.为了减少这个开销,为了减少这个开销Oracl ...
- oracle 物化视图的自动刷新方法
oracle 物化视图的自动刷新方法: 方法1,直接在创建的时候,指定start with ,如下代表每分钟执行1次 create materialized view big_table_mv nol ...
- mysql 物化视图 更新_物化视图的快速刷新测试与物化视图日志
前言:一般在创建物化视图的时候,在数据量不大的时候,刷新的方式都是采用完全刷新的.随着系统的使用一些物化视图的源表的数据量在不断的增长,原本采用完全方式几秒就能刷新完成的物化视图,现在需要等待很久的时 ...
- 物化视图是否可以exp导出_物化视图导出导入可能导致物化视图日志的失效
SQL> create user yang identified by yang; 用户已创建. 已用时间: 00: 00: 00.10 SQL> grant resource,conn ...
- 数据库链、物化视图、高级复制方面
数据库链相关内容: JOB自动执行出错,但手工执行正常--浅谈job和database link的一个特点 :描述了匿名数据库链的特点,以及和JOB配合使用时会出现的情况. 通过数据库链执行DDL语句 ...
- 物化视图的刷新方式说明
2019独角兽企业重金招聘Python工程师标准>>> 物化视图可以选择三种不同的刷新方式,根据不同的需求,选择不同的刷新方式. Complete刷新:会删除表中的所有记录(如果是单 ...
- 数据库 物化视图详解
物化视图 物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照.物化视图可以基于表查询,视图和其它的物化视 ...
- oracle 物化视图、中间表的方案
物化视图 有个项目因为有比较多的查询汇总,考虑到速度,所以使用了物化视图.简单的把用到的给整理了下.先看简单创建语句: create materialized view mv_materialized ...
最新文章
- java窗口坐标_如何在Java中获取窗口外部的鼠标单击坐标
- Normal Equations 的由来与推导
- 拖链电缆 机器人电缆_选购电缆拖链需要注意哪些要点
- 【五】每个球队胜率统计
- 《Android 应用案例开发大全(第二版)》——导读
- 全面整理(随时更新)
- 数据安全_个人信息查询
- 点燃乌镇,三星已重返战场!国行版Galaxy S10最高售价10999元...
- h5 宽度全屏自适应
- 渤海银行天津分行计算机笔试,关于渤海银行笔试经验分享
- 已知三角形顶点坐标,求其外接圆的公式
- Ubuntu 20.04 + mysql 8.0.27 用户名和密码修改(非常实用)
- 一个大学老师的2020
- typec耳机知识介绍-数字耳机,模拟耳机
- FSL安装教程(Ubuntu)
- Mac使用技巧:快捷键也可清理Safari浏览数据!
- 机器学习极简入门课程
- ssm+jsp计算机毕业设计CheatEngine学习系统4i3k0(程序+LW+源码+远程部署)
- 台媒:台积电预计在台湾新竹建设使用2纳米制程的工厂
- 三十、元素的显示与隐藏
热门文章
- 【GIF动画+完整可运行源代码】C++实现 插入排序——十大经典排序算法之三
- Dev-Cpp 常用的快捷键(持续更新)
- 中学计算机老师的英语,中学计算机老师的路在何方?
- 聚合链路出现Destination host unreachable
- 如何自动修复XP/VISTA/WIN7系统引导的工具(NTBootAutofix 2.02)
- Java连接SQL2005及SQL Server JDBC Driver 2.0中sqljdbc.jar和sqljdbc4.jar的区别
- 开发html5单页用什么框架,GitHub - mmcai/single-page-react-h5: 基于React框架的单页活动框架,可以基于此代码上进行相关的H5活动等相关内容的开发...
- esxi安装openwrt_双软路由安装——ROS安装、上网、DNS缓存、常用设置(小白教程)...
- putty 连接虚拟机_使用Putty连接虚拟机
- 台安变频器n2按键说明_台安N2变频器说明书.pdf