设为首页 收藏本站
查看: 1176|回复: 0

[经验分享] oracle技术之Oracle 物化视图(二)

[复制链接]

尚未签到

发表于 2018-9-24 14:58:18 | 显示全部楼层 |阅读模式
  二. 物化视图实例
  物化视图的快速刷新采用了增量的机制,在刷新时,只针对基表上发生变化的数据进行刷新。因此快速刷新是物化视图刷新方式的首选。
  但是快速刷新具有较多的约束,而且对于采用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  INSERT INTO C SELECT ROWNUM, 'C'||ROWNUM FROM USER_TABLES WHERE ROWNUM  INSERT INTO A SELECT ROWNUM, TRUNC((ROWNUM - 1)/2) + 1, TRUNC((ROWNUM - 1)/3) + 1, ROWNUM
  2  FROM USER_TABLES
  3  WHERE ROWNUM  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,>  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;
  删除物化视图日志
  --删除日志:
  DROP materialized view log on A;
  --删除物化视图
  DROP materialized view MV_ABC;
  oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-600685-1-1.html 上篇帖子: oracle技术之Oracle 物化视图(一) 下篇帖子: 【oracle】tar方式安装oracle软件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表