什么是刷新组
通常我们创建的MView会不止一个,而且各个MView的Master Table之间是
有约束,数据一致性关联的,如果我们对各个MView分开刷新的话我们是不
能保证关联数据的完整性和事务的一致性的。Oracle提供了刷新组来解决这
个问题。在刷新组刷新之后Oracle可以保证在刷新组里面的所有的表在刷新
的那个时间点的是一致的。
刷新组的大小
Oracle专门针对大的MView刷新组做了优化,也就是说对于相同数量的MView
来说一个大的刷新组要多个小的刷新组刷新的要快,即刷新的一个含有100
个MView的刷新组要比刷新5个各含有20个MView的刷新组要快。
但是速度不是唯一的需要注意的问题,再决定一个刷新组大小的时候我们还
需要考虑下面的这些问题:
数据的一致性
就像我们上面所说的,数据的完整性和事物的一致性是我们最需要考虑的
问题,考虑大小之前先保证一致性。
表锁
再刷新组的刷新期间,所有的在组里面的表会被锁住而不让别的程序进行
更新的操作,因为表的更新会破坏数据的一致性。这样就造成刷新组越大,
表被锁的时间也就越长。因此针对这个来说越小的刷新组是越有利的。
网络的稳定性
如果在一个刷新组刷新完成之前网络终端的话将会导致整个组的刷新回滚,
因此在网络不好的时候越大的刷新组是越不利的,我们需要根据网络的状况
来调整我们的刷新组的大小。
大刷新组的优点:
1. 相比较多个小的刷新组来说大的刷新组刷新速度要更快些
2. 一次刷新命令就能够把组里面的MView全部刷新
小刷新组的优点:
1. MView被锁住的时间要短些
2. 网络条件不好的时候可能会导致整个组刷新的回滚,浪费时间
刷新组的基本操作
说完了刷新组的概念之后,接下来我们来进行下实际的演练。Oracle使用
DBMS_REFRESH包来进行刷新组的创建和管理操作,下面我们一个个说明下。
建立刷新组
下面为我们前面建立的MView创建一个名为SFIS1.MV_REFRESH_GROUP的
刷新组,这个刷新组将每2分钟做一次刷新。
-- 我们先来创建一个刷新组
begin DBMS_REFRESH.MAKE(
name => 'SFIS1.MV_REFRESH_GROUP',
list => '',
next_date => SYSDATE,
interval => 'SYSDATE+(2/(24*60))'
);
end;
/
接下来要介绍的是DBMS_REFRESH.ADD方法, 下面我们将前面建立的
MView MVT加入到刷新组里面:
begin DBMS_REFRESH.ADD(
name => 'MV_REFRESH_GROUP',
list => 'SFIS1.AAA_MV2'
);
end;
/
相关视图: dba_refresh , dba_refresh_children , dba_jobs
可以调用DBMS_REFRESH.REFRESH对整个组进行手工的刷新操作。
维护刷新组
下面说下DBMS_REFRESH的另外三个方法,分别是CHANGE, SUBTRACT和DESTROY。
CHANGE Procedure
改变刷新组的刷新频率。
DESTROY Procedure
删除刷新组里面所有的MView并将刷新组删除。
SUBTRACT Procedure
从刷新组里面删除指定的MView。
用法也是很简单,就演示下它们的用法:
-- 改变 interval
begin DBMS_REFRESH.CHANGE(
name => 'MV_REFRESH_GROUP',
next_date => sysdate,
interval => 'SYSDATE+(5/(24*60))'
);
end;
/
-- 把我们刚刚建立的TEST_GROUP删除掉, 当然这时我们的job也已经消失了
SQL> exec dbms_refresh.destroy('SFIS1.MV_REFRESH_GROUP');