物化视图刷新的问题及分析(61天)

最近现场需要搭建一套全新的环境,对于数据字典的管理采用了物化视图,因为数据量不大,采用了全量刷新的方式。因为有好几套环境,有几套环境是通过db link和主节点的表创建的物化视图,这几个节点间的网络情况不好,刷新一个稍微大一些的表或者带有lob字段的表时,速度会很慢,因为有好几套环境,一套一套的等待刷新完得花费不少的时间,所以自己想写一个shell脚本让它在后台慢慢跑,这样过一段时间再看看日志保证数据都已经刷新完毕就可以了。 原本采用的方式是

create materialized view xxx as select *from xxxx@xxxx;

刷新的速度确实太慢, 然后自己灵机一动,想先创建物化视图,然后让它在后台慢慢刷新,类似下面的方式

create materialized view xxxx as select *from xxx@xxxx where rownum<1;
exec dbms_mview.refresh('XXXX','C');

这样先创建完成后慢慢刷新就可以了,我也可以先把权限之类的先分配好,直接能够访问。 简单的写了个脚本测试了一下,发现速度确实快了不少,创建和刷新的速度都奇快。 第二天,开发反馈很多数据字典都是空的。自己先查看刷新日志,发现都是刷新过的。然后怀疑是不是数据的刷新问题,又手工刷新了一次,发现基表的数据有好几十条,但是刷新之后还是0条,接连试了几次,还是0条,感觉就像是bug一样。 最后才算想明白,就是自己的一个小聪明导致的,其实下面的语句在table和materialized view中代表的意义是不同的。

create table test as select *from xxxx where rownum<1;

create materialized view test as select *from xxxx where rownum<1; 下面简单来做一个测试,说明一下。 创建测试的物化视图test_mv,有5条数据。 SQL> create materialized view test_mv as select *from cat; Materialized view created. SQL> select count(*)from test_mv; COUNT(*) ---------- 5 然后删除物化视图,重建 SQL> drop materialized view test_mv; Materialized view dropped. SQL> Create materialized view test_mv as select *from cat where rownum<1; Materialized view created. SQL> select count(*)from test_mv; COUNT(*) ---------- 0 然后开始全量刷新,刷新之后数据条数还是0条。无论刷新多少次都是0条。

SQL> exec dbms_mview.refresh('TEST_MV','C'); PL/SQL procedure successfully completed. SQL> select count(*)from test_mv; COUNT(*) ---------- 0 其中的奥秘就在于(使用dbms_metadata来查看物化视图的创建语句)

SQL> select dbms_metadata.get_ddl('MATERIALIZED_VIEW','TEST_MV') from dual;
  CREATE MATERIALIZED VIEW "N1"."TEST_MV" ("TABLE_NAME", "TABLE_TYPE")
  ORGANIZATION HEAP PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "TEST_DATA2"
  BUILD IMMEDIATE
  USING INDEX
  REFRESH FORCE ON DEMAND
  USING DEFAULT LOCAL ROLLBACK SEGMENT
  USING ENFORCED CONSTRAINTS DISABLE QUERY REWRITE
 AS select *from cat where rownum<1

在创建物化视图的时候,它会在末尾加上一个rownum<1,这样就使得无论怎么刷新,数据都进不来,所以仔细想想,物化视图在这个时候有点视图的意思。 最后对于那个问题的解决方式就是重新来创建物化视图.

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2014-05-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨建荣的学习笔记

MySQL中的Online DDL(第一篇)(r11笔记第3天)

记得有一天快下班的时候,一位开发同事找到我说,需要对一个表做变更,数据量据说有上千万,而当时是使用的MySQL版本是5.5,这可如何是好,对于在线业务要求高的情...

3339
来自专栏杨建荣的学习笔记

Oracle 12c PDB浅析(r9笔记第10天)

不管怎么样,12c出来这么久,总是因为各种各样的原因没有开始学习,现在似乎还是有些晚了。总是耳闻PDB在12c是一种全新的架构模式,在各种技术聊 天也大概知道是...

2667
来自专栏杨建荣的学习笔记

一次ORA-00600问题的排查和分析(r5笔记第64、65天)

昨天处理了一起ora-00600的错误,其中也经历了各种曲折,真是雾里看花,看透了之后发现很多问题都是有原因的。 起初是开发说有一个job运行的时候报错了,数据...

3639
来自专栏杨建荣的学习笔记

分分钟搭建MySQL Group Replication测试环境(二)(r12笔记第41天)

之前总结过一篇,分分钟搭建MySQL Group Replication测试环境(r11笔记第82天),但是有一个地方还有待改善,那就是那个脚本仅仅支持s...

3167
来自专栏漫漫全栈路

Oracle数据库项目——MC服务器管理系统

数据库设计内容,分为:系统功能说明,数据库分析与设计,数据库实现。本数据库系统提供的功能用于项目MC-Servers-Web,详情内容参见MC-Service...

4524
来自专栏Python

异常处理:1215 - Cannot add foreign key constraint

  最近在做新生入学系统,学生表中包括新生的班级,专业等信息,班级,专业就需要和班级表,专业表进行关联,但是在添加外键的过程中却出现了“Cannot add f...

19910
来自专栏杨建荣的学习笔记

使用shell批量生成数据整合式迁移的脚本(r8笔记第52天)

对于数据整合式迁移,基本就是小霸王的二合一,四合一,八合一这样的节奏,把几个尽可能相关业务的数据库中的数据整合到一个库里。彼此还是独立的schema,倒也是相安...

2444
来自专栏杨建荣的学习笔记

DBA和开发同事的一些代沟(三)(r7笔记第29天)

之前写了两篇关于DBA和开发同事的一些代沟,产生了一些共鸣,本身写这个的目的就是能够让DBA也试着从开发的角度来理解问题,开发同学也能够多学习一些DB的知识,D...

2725
来自专栏闵开慧

通过多种方式将数据导入hive表

hive官方手册 http://slaytanic.blog.51cto.com/2057708/939950 通过多种方式将数据导入hive表 1.通过外部...

3417
来自专栏数据和云

【安全为王】听说你最喜欢给所有用户授DBA的权限

编辑手记:最近很多朋友会问关于数据库用户授权的问题,经常问这样的问题,我能不能直接给用户DBA的角色,多方便。恩,方便是方便了,恶意操作和误操作也方便了。今天再...

2876

扫描关注云+社区