物化视图刷新必须绑定专用资源消费者组并合理配置并行参数:创建mv_refresh_group限制CPU、授权用户、会话内切换;parallel_max_servers需按并发任务与单次并行度计算,禁用parallel_adaptive_multi_user;DBMS_SCHEDULER作业须显式指定resource_consumer_group;COMPLETE刷新需确保PGA充足,避免磁盘排序降级。

物化视图刷新作业必须绑定专用资源消费者组
默认情况下,DBMS_MVIEW.REFRESH 作业会走 DEFAULT_CONSUMER_GROUP,一旦多个 MV 同时刷新或与 OLTP 事务争抢 CPU/IO,极易触发 enq: PS - contention 或 resmgr: cpu quantum 等等待。这不是“跑得慢”,而是资源被无差别调度导致的降级。
必须显式指定消费者组:
- 先创建隔离组:
CREATE CONSUMER GROUP mv_refresh_group LIMIT CPU_PCT = 30; - 再授权用户使用:
GRANT SWITCH_CONSUMER_GROUP TO mv_owner; - 刷新前切换:
DBMS_RESOURCE_MANAGER.SWITCH_CONSUMER_GROUP_FOR_SESS('mv_owner', 'mv_refresh_group'); - 该切换需在调用
DBMS_MVIEW.REFRESH前同一会话内执行,且不能依赖ALTER SYSTEM全局设置
并行刷新的 parallel_max_servers 必须按作业粒度配
parallel_max_servers 是全局硬上限,不是 per-job 配额。如果设为 20,但你同时跑 5 个 parallelism => 4 的 MV 刷新,实际能并发的 PX 进程只有 20,其余排队——而排队本身就会拖慢整体吞吐。
计算公式:最小值 = 单次最大并行度 × 并发刷新任务数 × 1.2(留缓冲)
例如:计划每小时刷 3 个 MV,每个设 parallelism => 4,则建议设 parallel_max_servers >= 15(而非拍脑袋设 100)
配套必须关掉自适应干扰:ALTER SYSTEM SET parallel_adaptive_multi_user = FALSE;,否则高负载时 Oracle 会悄悄把你的 4 降成 1
DBMS_SCHEDULER 作业必须显式指定 RESOURCE_CONSUMER_GROUP
用 DBMS_SCHEDULER.CREATE_JOB 替代传统 DBMS_JOB 时,很多人只写 job_action 和 start_date,漏掉资源绑定,结果作业仍跑在默认组里。
正确写法必须带 resource_consumer_group 参数:
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'refresh_mv_sales',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN DBMS_MVIEW.REFRESH(''DW.SALES_MV'', ''C''); END;',
start_date => SYSTIMESTAMP,
repeat_interval => 'FREQ=DAILY; BYHOUR=2; BYMINUTE=0',
resource_consumer_group => 'mv_refresh_group',
enabled => TRUE
);
END;
注意:resource_consumer_group 是 scheduler job 层级参数,和会话级 SWITCH_CONSUMER_GROUP 不冲突,但优先级更高;若两者不一致,以 job 定义为准
刷新期间 PGA 内存不足会导致 COMPLETE 刷退化为磁盘排序
COMPLETE 刷新大量数据时,Oracle 默认用 PGA 做排序和哈希连接。如果 pga_aggregate_target 不够,会静默切到临时表空间做磁盘排序——表现为 V$ALL_SQL_PLAN_MONITOR 中 BUFFER_GETS 很高但 DISK_READS 也飙升,且 elapsed_time 暴涨。
验证方法:查刷新 SQL 的 PLAN_OPERATION 是否出现 TEMP TABLE TRANSFORMATION 或 LOAD AS SELECT,这说明已落地磁盘
临时缓解:ALTER SESSION SET workarea_size_policy = MANUAL; ALTER SESSION SET sort_area_size = 209715200;(200MB),但长期应调大 pga_aggregate_target 并监控 V$PGASTAT 的 bytes_processed 和 extra_bytes_read/written











