物化视图并行刷新不依赖分区而取决于刷新类型、执行计划并行性及系统配置;仅complete或force刷新支持并行,fast刷新不支持;atomic_refresh在并行时强制为false,牺牲原子性换取性能。

物化视图并行刷新不依赖分区,而依赖刷新方式与系统配置
Oracle 中物化视图本身没有“跨分区并行刷新”这一原生概念——并行刷新(parallelism 参数)作用于整个物化视图的刷新过程,与基表是否分区、物化视图定义是否含分区键无关。真正影响并行能力的是:刷新类型(C 或 F)、底层执行计划是否可并行、以及数据库并行服务资源是否就绪。
REFRESH 时传 parallelism > 0 才可能触发并行,但需满足三条件
调用 DBMS_MVIEW.REFRESH 时设置 parallelism => 4 并不保证并行执行,必须同时满足:
-
method必须是'C'(COMPLETE)或'FORCE';'F'(FAST)刷新在 Oracle 19c 中不支持并行(即使传了parallelism也会被忽略) - 物化视图定义查询的执行计划中,关键操作(如全表扫描、聚合)需实际启用并行;可通过
EXPLAIN PLAN FOR查看PQ Distrib和IN-OUT列确认 - 数据库级并行参数已就位:
PARALLEL_MAX_SERVERS足够(建议 ≥ 2× 并行度),且用户有QUERY REWRITE或CREATE MATERIALIZED VIEW权限(部分版本要求显式ALTER SESSION ENABLE PARALLEL DML)
基表分区对并行刷新的实际影响很有限
分区本身不会自动带来并行优势,但它为并行执行提供了更优的物理基础:
- 若基表按时间字段分区(如
PARTITION BY RANGE(dt)),且物化视图查询含对应WHERE dt BETWEEN ...,优化器更可能生成分区裁剪 + 并行扫描计划 - 但物化视图日志(
MLOG$)不继承基表分区结构,FAST 刷新仍只能串行应用变更日志,无法利用分区做并发增量应用 - 手动强制 COMPLETE 刷新时,若物化视图定义中
SELECT引用了分区基表,且该表有并行度(ALTER TABLE t PARALLEL 4),则刷新内部的 INSERT AS SELECT 才可能并行
容易被忽略的关键限制:atomic_refresh 和并行不可兼得
当启用并行刷新时,atomic_refresh => TRUE(默认)会直接失效——Oracle 强制设为 FALSE,因为并行 DML 天然要求分段提交。这意味着:
- 刷新过程中,物化视图可能短暂处于不一致状态(例如只刷完部分分区数据)
- 若刷新中途失败,已提交的部分无法回滚,需人工干预清理或重刷
- 不能依赖
atomic_refresh => TRUE来保证“全刷成功或全不刷”,这是并行模式下的固有取舍
真正需要跨大范围数据高效刷新时,应优先确保基表分区合理、日志完备、并行资源充足,并接受非原子性作为性能代价。











