什么是刷新组
通常我们创建的MView会不止一个,而且各个MView的Master Table之间是有约束,数据一致性关联的,如果我们对各个MView分开刷新的话我们是不能保证关联数据的完整性和事务的一致性的。Oracle提供了刷新组来解决这个问题。在刷新组刷新之后Oracle可以保证在刷新组里面的所有的表在刷新的那个时间点的是一致的。
刷新组的大小
Oracle专门针对大的MView刷新组做了优化,也就是说对于相同数量的MView来说一个大的刷新组要多个小的刷新组刷新的要快,即刷新的一个含有100个MView的刷新组要比刷新5个各含有20个MView的刷新组要快。
上面是从网上找到的资料,下面就说说实践过程了。
为什么用刷新组
项目运行最终环境已经可以预见:多个子系统在不同地域运行,收集各自区域的生产数据,总部需要在其生产调度中心以最快的方式掌握下属区域的生产情况,通过物化视图的应用(参见上一篇:物化视图实践(1)----实现远程数据同步),已经解决了从区域同步数据到总部调度中心的需求。但是最终的操作是为每个物化视图分别建立了独自的JOB来实现快速刷新的,这就必然造成多个物化视图各自刷新,而且同类性质的物化视图刷新时间点也不一致,给后端数据分析造成不必要的影响。
所以有必要将同类性质物化视图的刷新统一管理起来,而Oracle自带的dbms_refresh包中提供的刷新组工具正好满足了我们的需求。
注:其实早先方式建立的物化视图也是用刷新组管理的,只不过刷新组的名字等于物化视图名字,而且组中就这么一个物化视图而已。
实践过程
1.创建刷新组
按数据性质(包括刷新频率等),创建不同的刷新组
EXEC Dbms_Refresh.make('GTCJ', '', SYSDATE, 'SYSDATE + 10/(24*60)');
EXEC Dbms_Refresh.make('BJXX', '', SYSDATE, 'SYSDATE + 10/(24*60*60)');
Commit;
2.删除原有刷新组
上面说过了(标红的那一行),既然要统一归并管理,那么就毙掉那些独立大队哈。
EXEC Dbms_Refresh.destroy('SYX_BJ_BJXX_MV'); --其实'SYX_BJ_BJXX_MV'也是一个刷新组
EXEC Dbms_Refresh.destroy('SYX_BJ_BJXX_MV2');
……
EXEC Dbms_Refresh.destroy('SCY_SGT_GTCJ_MV');
EXEC Dbms_Refresh.destroy('SCY_SGT_GTCJ_MV2');
……
Commit;
3.归并统一刷新组
EXEC Dbms_Refresh.add('GTCJ','scy_sgt_gtcj_mv,scy_sgt_gtcj_mv2'); --归并到GTCJ这个刷新组中
EXEC Dbms_Refresh.add('BJXX','syx_bj_bjxx_mv,syx_bj_bjxx_mv2');
Commit;
OK,到这里基本完工了,看看效果,刷新组被精简了,DBMS_jobs也精简了。
SELECT Mview_Name, Refresh_Mode, Refresh_Method, Last_Refresh_Date FROM User_Mviews;
MVIEW_NAME REFRESH_MODE REFRESH_METHOD LAST_REFRESH_DATE
1 SCY_SGT_GTCJ_MV DEMAND FAST 2013-12-28 21:31:16
2 SYX_BJ_BJXX_MV DEMAND FAST 2013-12-28 21:36:03
3 SCY_SGT_GTCJ_MV2 DEMAND FAST 2013-12-28 21:31:16
4 SYX_BJ_BJXX_MV2 DEMAND FAST 2013-12-28 21:36:03
SELECT Rname, Job, Next_Date, INTERVAL, Broken FROM User_Refresh;
RNAME JOB NEXT_DATE INTERVAL BROKEN
1 BJXX 161 2013-12-28 21:39:29 SYSDATE + 10/(24*60*60) N
2 GTCJ 141 2013-12-28 21:41:15 SYSDATE + 10/(24*60) N
SELECT Rname, NAME, Job, Next_Date, INTERVAL, Broken FROM User_Refresh_Children;
RNAME NAME JOB NEXT_DATE INTERVAL BROKEN
1 BJXX SYX_BJ_BJXX_MV 161 2013-12-28 21:42:56 SYSDATE + 10/(24*60*60) N
2 BJXX SYX_BJ_BJXX_MV2 161 2013-12-28 21:42:56 SYSDATE + 10/(24*60*60) N
3 GTCJ SCY_SGT_GTCJ_MV 141 2013-12-28 21:51:20 SYSDATE + 10/(24*60) N
4 GTCJ SCY_SGT_GTCJ_MV2 141 2013-12-28 21:51:20 SYSDATE + 10/(24*60) N
4.其它刷新组命令
Dbms_Refresh.change 修改刷新组的运行参数,如刷新频率;
Dbms_Refresh.subtract 删除刷新组中的物化视图,可以一次删除多个,正如上面一次加入多个的方式。