oracle 19c rac默认不跨节点执行并行查询,因优化器优先将orap000*进程分配至本地实例以降低延迟;真正控制跨节点的是parallel_instance_group与各节点instance_groups的交集,而非parallel_force_local(已废弃)。
oracle 19c rac 默认不跨节点执行并行查询,即使你写了 parellel 提示或设置了表级 parallel 属性,优化器仍大概率把所有 orap000* 进程分配到发起 sql 的本地实例上——这不是 bug,是设计行为。
为什么 ALTER SESSION SET PARALLEL_INSTANCE_GROUP = 'xxx' 没生效
常见现象:你在节点1执行 ALTER SESSION SET parallel_instance_group = 'dw';,但 V$PX_SESSION 里 INST_ID 全是 1,压根没跨出去。
- 根本原因不是会话设置错了,而是该节点的
instance_groups参数里没有包含'dw'——parallel_instance_group只能指向本节点已声明的组名,否则被静默忽略 - 查证方式:
SHOW PARAMETER instance_groups;若返回空或不含dw,需先在对应节点执行ALTER SYSTEM SET instance_groups='dw' SCOPE=SPFILE SID='racdb1'; - 改完必须重启实例(
instance_groups是静态参数),不能只靠ALTER SYSTEM生效 - 注意:多个节点的
instance_groups值可以不同,但只要都含同一个组名(如'dw'),这个组就构成跨节点调度边界
如何验证并行是否真跨了节点
别只看执行计划里的 PQ 字样,那只是“用了并行”,不是“跨了节点”。关键看数据流和进程分布。
- 查
V$PX_SESSION:SELECT INST_ID, COUNT(*) FROM gv$px_session GROUP BY INST_ID;—— 若结果多于一行,说明跨了;若只有单行,就是本地挤爆了 - 查
V$PQ_TQSTAT:关注IN-OUT列,出现PCWP(Parallel Combine with Parent)或PCWC(Parallel Combine with Child)才代表有跨实例数据分发;纯PQ表示全程本地 - 查
V$SESSION中MODULE和ACTION:并行从属进程的MODULE通常是ora_p000_*,ACTION含slave字样,结合INST_ID就能定位实际运行位置
PARALLEL_FORCE_LOCAL = TRUE 在 19c RAC 中的实际效果
设成 TRUE 不是“限制跨节点”,而是直接禁用跨节点能力——所有并行进程强制钉死在 coordinator 所在实例,哪怕其他节点 CPU 空闲 90% 也完全不参与。
- 后果明显:
V$PX_SESSION.INST_ID全一致、V$PQ_TQSTAT无PCW*、AWR 中PX Idle Wait和latch: shared pool等待飙升 - 19c+ 已标记为废弃,RAC 下行为不可靠;它不干预
parallel_instance_group调度逻辑,仅作为兜底限制 - 真正控制跨节点的是
parallel_instance_group+ 各节点instance_groups的交集,不是这个参数 - 除非你要跑一个必须独占本节点资源的高优 ETL,否则不要碰它
RMAN 备份和 Data Pump 的跨节点并行陷阱
它们和普通 SQL 并行机制不同,不走 parallel_instance_group,而是依赖独立的通道/Worker 分配策略。
- RMAN 必须显式写
CONNECT 'sys/oracle@racdb1'到每个ALLOCATE CHANNEL,且 TNS 别名必须指向具体实例(不能是 SCAN 地址),否则所有通道全落在随机选中的单节点上 - Data Pump 的
PARALLEL参数只控制 Worker 数量,是否跨节点取决于CLUSTER参数(默认Y)和对象分区属性;若CLUSTER=N,哪怕设PARALLEL=32也只在本地跑 - 两者都不受
PARALLEL_FORCE_LOCAL影响,但都受parallel_max_servers和实时资源水位制约——看到CURRENT_PARALLELISM低于请求值,优先查这个参数和 PGA 使用率
跨节点并行不是开个参数就自动变快,它引入 GC 流量和网络传输开销。真正有效的配置,是让 parallel_instance_group 和 instance_groups 对齐后,再结合业务数据分布(比如按节点局部化分区)、避免混用 NO_PARALLEL 提示、并监控 gc cr block busy 等等待事件——这些细节比单纯调高 DOP 更影响实际吞吐。











