基于预填充表创建物化视图,刷新时如何保留原有数据?
解决预建表物化视图刷新时保留原数据的问题
当你基于预建表创建物化视图后状态为unknown,默认全量刷新会清空重填数据,要保留预建表数据并让MV支持查询重写,可通过以下方法实现:
核心方案:用一致性验证替代全量刷新
调用DBMS_MVIEW.REFRESH时指定method => 'C'参数执行一致性验证:
exec dbms_mview.refresh(list => 'T_MV', method => 'C');
这个操作会对比预建表数据与物化视图定义的查询结果:
- 若数据完全匹配,MV状态直接更新为
fresh,不会修改预建表的任何数据(包括原有的排序规则); - 若数据不匹配,Oracle会自动执行全量刷新同步数据。
前置要求
- 预建表的结构(列名、数据类型、精度等)必须和物化视图定义的查询结果完全一致;
- 预建表的数据要严格符合物化视图的查询逻辑(即执行
select col1, col2, col3 from t得到的结果,和预建表t_mv的数据完全相同)。
补充说明
如果后续需要增量刷新,需满足:
- 基表
t已创建对应的物化视图日志; - 创建物化视图时指定支持快速刷新的属性,示例:
create materialized view t_mv on prebuilt table enable query rewrite with primary key as select col1, col2, col3 from t ;
内容的提问来源于stack exchange,提问作者Michael Jin
相关产品推荐
相关产品推荐

