物化视图刷新的问题及分析(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 条评论
登录 后参与评论

相关文章

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

手工创建/删除数据库的步骤

今天和大家分享下数据库的创建和删除的步骤,里面有很多细节需要大家考虑。创建数据库不只是一个create database语句。删除数据库 drop databa...

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

MySQL和Oracle的添加字段的处理差别 (r10笔记第73天)

昨天在微信群中有个朋友也是无意中问了一下,说数据库中的表字段想保持一种相对规范的顺序,怎么办?要知道Oracle中这个操作就比较纠结了,因为是按照追加的方式来处...

3606
来自专栏数据库

oracle常用命令大全

一、Oracle数据库实例、用户、目录及session会话查看: 1、ORACLE SID查看设置 查看SID、用户名 $ env|grep SID 、sele...

4607
来自专栏乐沙弥的世界

临时表空间的管理与受损恢复

      Oracle 临时表空间是Oracle数据库的重要组成部分,尽管该部分并没有cont体系结构上得以展现,但其重要地位也是不容忽视的。尤其是 对于大...

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

MySQL中使用pt-osc的一些小结

Percona的pt-osc工具算是DBA的一个福利工具。想想一个数据量有些大的表,在上面做DDL操作真是一种煎熬,我们也基本理解了这是一种空间换时间的...

1361
来自专栏idba

死锁案例之一

一 前言 死锁,其实是一个很有意思也很有挑战的技术问题,大概每个DBA和部分开发同学都会在工作过程中遇见 。关于死锁我会持续写一个系列的案例分析,希望能够对想...

793
来自专栏学习有记

包含列的索引:SQL Server索引进阶 Level 5

1462
来自专栏维C果糖

出现 DB2 SQL Error: SQLCODE = -798, SQLSTATE = 428C9 错误的原因及解决方法

1 错误描述 在通过「DbVisualizer」执行 SQL 语句插入数据的时候,报出如下错误: ? 2 错误原因 通过观察上述标记出来的错误描述: DB2 ...

2455
来自专栏漫漫全栈路

Oracle 学习笔记

前言 本贴内容纪录Oracle课程中的学习笔记,和Oracle的课后作业,以及数据库相关课程的学习笔记,笔记部分使用实例代码记录,不记详细语法。 用户管理...

3525
来自专栏Jerry的SAP技术分享

在ABAP里取得一个数据库表记录数的两种方法

这个函数使用起来很简单,只需要将想查询的数据库表名称维护进输入参数IT_TABLES:

1655

扫码关注云+社区

领取腾讯云代金券