物化视图全量刷新的简单测试

关于物化视图的刷新,如果数据的变化比较大采用了全量刷新的时候,会将现有表里的数据都清空然后放入新的数据,整个过程有点类似delete,insert的感觉,但是刷新后表的高水位线还是会保持不变,效果类似于truncate,insert.
对于堆表来说,在重要的一些表上做truncate简直就是灾难,如果一个表访问频繁,做了truncate之后,在插入数据的过程中,如果访问该表,数据都是0条,这就会带来一些高可用性的问题来,如果采用一个事务,使用delete,insert的方式,那高水位线的问题还是得不到解决,可能在高版本中可以使用shrink之类的方式来做,但是还是有一定的影响。

创建一个物化视图,数据量在40万左右。

create materialized view test_mv tablespace pool_data as select *from test;

使用如下的shell脚本在另一个窗口中执行,来查看物化视图中的数据条数。

while true

do

sqlplus -s n1/n1

set timing on

set pages 0

set feedback off

select count(*)  from test_mv;

EOF

done

插入数据之后,反复刷新,让刷新的时间基本稳定下来。

SQL> set time on

08:37:52 SQL>  exec dbms_mview.refresh('TEST_MV','C');

PL/SQL procedure successfully completed.

Elapsed: 00:00:50.27

插入一条数据,然后采用全量刷新

08:38:50 SQL> insert into test select *from test where rownum

1 row created.

Elapsed: 00:00:00.10

08:39:44 SQL> commit;

Commit complete.

18:20:33 SQL> exec dbms_mview.refresh('TEST_MV','C');
PL/SQL procedure successfully completed.
Elapsed: 00:00:24.62
18:21:12 SQL> exec dbms_mview.refresh('TEST_MV','C');
PL/SQL procedure successfully completed.
Elapsed: 00:00:26.05
时间基本稳定在20多秒的样子,然后开始测试,在另外一个窗口中执行shell脚本,不停的会去查物化视图里的数据,根据oracle的读一致性,基本都会从undo中读取数据
可以看到刷新的时间开始延长,但是数据条数没有任何变化。
18:24:48 SQL>  exec dbms_mview.refresh('TEST_MV','C');
PL/SQL procedure successfully completed.
Elapsed: 00:00:37.49

以下是shell脚本执行时的日志,可以看到数据条数没有任何变化,也算是高可用性的一种体现吧,不过在特定的场景中可以考虑一下。
411425
Elapsed: 00:00:03.76
    411425
Elapsed: 00:00:01.01
    411425
Elapsed: 00:00:01.03
    411425
Elapsed: 00:00:01.07
    411425
Elapsed: 00:00:01.87
    411425
Elapsed: 00:00:00.76
    411425
Elapsed: 00:00:03.60
    411425
Elapsed: 00:00:03.00
    411425
Elapsed: 00:00:04.28
    411425
Elapsed: 00:00:05.06
    411425
Elapsed: 00:00:08.61
    411425
Elapsed: 00:00:02.44
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.03
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.03
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.03
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.03
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.03
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.04
    411425
Elapsed: 00:00:00.03

    

时间: 2024-10-23 08:48:36

物化视图全量刷新的简单测试的相关文章

【物化视图】根据物化视图日志快速刷新物化视图的过程

先来再次分析一下物化视图日志的结构. yang@rac1>create table t (id number ,name varchar2(30),val number); Table created. yang@rac1>create materialized view log on t with rowid,sequence (id,name) including  new values; Materialized view log created. yang@rac1>desc m

oracle基于COMMIT SCN的物化视图日志快速刷新的方法

11.2中物化视图日志可以指定COMMIT SCN,这时物化视图刷新就不需要时间戳了,这篇简单描述Oracle是如何实现通过COMMIT SCN来进行刷新的. 建立一个测试环境: SQL> SELECT * FROM V$VERSION; BANNER -------------------------------------------------------------------------------- Oracle Database11gEnterprise Edition Relea

【物化视图】速刷新物化视图都必须满足的条件

所有类型的快速刷新物化视图都必须满足的条件: 1.物化视图不能包含对不重复表达式的引用,如SYSDATE和ROWNUM: 2.物化视图不能包含对LONG和LONG RAW数据类型的引用.但是从测试环境上看支持对raw类型的引用. 1.不能包括GROUP BY语句或聚集操作: yang@rac1>create materialized view mv_yang_err refresh fast on commit with rowid   2  as select id ,count(1)  fr

物化视图刷新的问题及分析

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

物化视图刷新结合ADG的尝试

之前写过一篇 物化视图刷新结合ADG的尝试,想必绝大多数的朋友看完再没有深究,其实也有些朋友做了建议,让我尝试prebuilt来做.这种数据迁移方式用的比较少,但是个人感觉还是很不错的.如果迁移的表不是很多,这种迁移方式还是非常强大的. 如果一个表非常大,我目前的设想就是通过ADG备库来把数据首先同步到统计库中,然后在主库端通过物化视图日志来增量刷新. 使用物化视图 prebuilt的方式确实可以实现,我产生了几个疑问,物化视图日志该什么时候创建.创建的时间太早或者太晚,对于增量刷新是否有影响,

oracle如何利用触发器对物化视图刷新进行定制

物化视图的刷新其实和普通的SQL执行没有什么本质的区别,因此也可以通过在物化视图上创建触发器的方式,对刷新操作进行定制. 正好前两天有人在BLOG上问我,如果在物化视图添加一个时间戳列,并在物化视图更新的时候,自动维护这个列.其实很简单,通过触发器就可以达到这个目的: SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30)); 表已创建. SQL> INSERT INTO T SELECT ROWNUM, TNAME FROM

物化视图刷新失败导致日志表异常增大

整理自:http://blog.itpub.net/231499/viewspace-63714/ 今天在检查时,发现某个物化视图日志占用的空间超过150M,再检查看,该物化视图日志表的记录数有150W,由于其对应的物化视图没有会刷新一次,结合业务量分析可知:物化视图日志不能正常清除. 下面的解决步骤 --在源库查询物化视图对应日志条目个数SQL> select count(1) from MLOG$_ITEM_TAG; COUNT(1)----------532515 --在物化视图端刷新物化

物化视图中的统计信息导致的查询问题分析和修复

今天开发的同事下午反馈给我一个问题,说有操作直接卡住了,听这个描述,感觉很可能是查询慢了. 于是连接到环境中,查看了一下正在执行的sql语句情况,发现下面的语句已经执行了一段时间. 语句类似下面的形式: select t1.SECURITY_PHONE as MOBILE_PHONE, t1.SECURITY_EMAIL as OTHER_EMAIL, t2.* from accstat.ACCOUNT_DELTA t1, bidata.TMP_CN06 t2 where t1.CN_MASTE

Oracle物化视图详解

一. 理论部分 Oracle的物化视图是包括一个查询结果的数据库对像,它是远程数据的的本地副本,或者用来生成基于数据表求和的汇总表.物化视图存储基于远程表的数据,也可以称为快照. Oracle的物化视图提供了强大的功能,可以用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免进行这些耗时的操作,而从快速的得到结果.物化视图有很多方面和索引很相似:使用物化视图的目的是为了提高查询性能:物化视图对应用透明,增加和删除物化视图不会影响应用程序中SQL语句的正确性和有效性