Oracle分区表UPDATE需同时满足四个条件才启用并行DML会话级启用ENABLE_PARALLEL_DML、SQL中显式添加PARALLEL提示、WHERE条件实现精准分区裁剪、避免绑定变量导致裁剪失效。Oracle 分区表更新时 ENABLE_PARALLEL_DML 不生效并行 dml 默认是关闭的哪怕表是分区的、会话开了 alter session enable parallel dml执行 update 仍走串行。根本原因是oracle 要求显式指定并行度或依赖优化器自动选择且语句本身需满足并行触发条件——比如必须带分区裁剪where 条件能精准定位到具体分区否则优化器直接忽略并行提示。常见错误现象UPDATE t PARTITION (p2024) SET ... 看似指定了分区但没加 /* PARALLEL(t, 4) */ 提示或漏了 ENABLE_PARALLEL_DML更隐蔽的是用了绑定变量导致分区裁剪失败优化器无法确认操作范围自动降级为串行。必须在会话级先执行 ALTER SESSION ENABLE PARALLEL_DML仅 ALTER SESSION ENABLE PARALLEL QUERY 不够UPDATE 语句里要带 /* PARALLEL(t, N) */ 提示N 建议设为分区数 × CPU 核心数 / 2避免过度争用WHERE 条件必须能精确落到单个或多个已知分区例如 WHERE dt DATE 2024-01-01 AND dt 前提是 dt 是分区键且是范围分区避免在 WHERE 中使用函数如 TO_CHAR(dt, YYYY)否则分区裁剪失效整个表被扫描无法并行如何让不同分区真正“同时”被更新Oracle 并行 DML 的“同时”不是靠人工拆成多个 UPDATE 语句去跑而是由一个语句触发并行服务器进程PX每个进程负责一部分分区数据。关键在于分区必须可独立处理不能有跨分区约束或唯一索引冲突。使用场景典型如按月分区的日志表批量修正某几个月的数据若表上有全局唯一索引并行更新可能因键冲突报 ORA-12838: cannot read/modify an object after modifying it in parallel。优先使用本地索引LOCAL避免全局索引带来的并行限制如果必须用全局索引更新前临时禁用ALTER INDEX ... UNUSABLE更新完重建否则并行会退化不要手动写多个 UPDATE ... PARTITION (p1) UPDATE ... PARTITION (p2)这本质是串行提交还增加事务开销检查执行计划确认 UPDATE 操作节点下有 PX SEND 和 PX RECEIVE才是真并行PARALLEL 提示不起作用的三个硬性条件即使语法全对、会话已启用以下任一条件不满足Oracle 就强制走串行路径且不会报错只默默忽略提示。 VWO 一个A/B测试工具