← 返回题目列表

Oracle 并行查询和并行 DML 是什么?为什么不能盲目开并行?

中等 第 22 / 32 题 更新于 2026/07/30
Oracle并行查询Parallel DML

简化版

Oracle 并行执行会把大查询或大 DML 拆给多个并行进程处理,提高吞吐,但会消耗更多 CPU、I/O、内存和并行服务器资源。它适合大表扫描、批处理、ETL,不适合高并发 OLTP 小查询盲目开启。

详细版

可以通过对象属性、Hint 或会话设置启用并行,例如:

SELECT /*+ parallel(t 8) */ count(*)
FROM big_table t;

并行查询常用于数据仓库和报表;并行 DML 还需要启用:

ALTER SESSION ENABLE PARALLEL DML;

并行不是免费加速。并行度过高会抢占系统资源,让其他 SQL 变慢,还可能产生并行进程等待、临时空间压力和锁竞争。

完整版教学

一、并行执行解决什么问题

单个进程扫描 10 亿行表可能很慢。并行执行把任务拆成多个粒度,由多个并行执行服务器同时处理。

大表数据块
  -> PX1 扫一部分
  -> PX2 扫一部分
  -> PX3 扫一部分
  -> QC 汇总结果

这里 QC 是 Query Coordinator,负责协调并行进程和汇总结果。

二、并行度是什么意思

并行度 DOP 表示期望使用多少并行执行资源。parallel(t 8) 大致表示对表 t 使用并行度 8。

SELECT /*+ parallel(t 8) */ *
FROM sales t
WHERE sale_date >= DATE '2026-01-01';

如果表很小,启动并行进程的开销可能比收益还大。并行适合大扫描、大聚合、大装载。

三、并行 DML 的特殊点

并行查询只是读;并行 DML 涉及 insert、update、delete、merge。Oracle 要求会话启用 Parallel DML。

ALTER SESSION ENABLE PARALLEL DML;

INSERT /*+ parallel(t 8) */ INTO target t
SELECT /*+ parallel(s 8) */ * FROM source s;

并行 DML 对锁、undo、redo 和后续访问都有影响,通常用于批处理窗口,而不是在线小事务。

四、为什么不能盲目开并行

并行会把一个 SQL 的资源需求放大。如果 20 个会话同时跑并行度 8 的 SQL,理论上可能需要 160 个并行执行资源。

CPU、I/O、内存、临时表空间都会被拉高。一个 SQL 变快,整个系统可能变慢。

场景并行是否合适
夜间批量汇总适合
数据仓库大扫描适合
OLTP 主键查询不适合
高并发接口 SQL通常不适合

五、如何观察并行执行

执行计划里会出现 PX 相关操作,如 PX COORDINATOR、PX SEND、PX BLOCK ITERATOR。还可以通过动态性能视图观察并行会话。

并行 SQL 的瓶颈可能在数据分发、倾斜、临时空间或某个并行进程慢。并行不是简单“线程越多越快”。

如果数据倾斜严重,8 个并行进程里 1 个处理 80% 数据,整体速度仍受最慢进程限制。

六、常见误区与追问

  • 误区:并行度越高越快。 资源有限且存在协调成本,并行过高会拖慢系统。
  • 误区:并行适合所有慢 SQL。 小查询和高并发 OLTP 通常不适合。
  • 误区:Hint 写 parallel 就一定按该并行度执行。 实际还受参数、资源和优化器决策影响。
  • 追问:并行 DML 前要做什么? 通常需要 ALTER SESSION ENABLE PARALLEL DML
  • 追问:并行 SQL 主要看什么计划节点? 看 PX COORDINATOR、PX SEND、PX BLOCK ITERATOR 等。

七、加强记忆

记忆钩子:并行像多叫几辆叉车搬货,大仓库会快,小包裹反而调度更麻烦;叉车太多还会堵仓库门。

回答这题要讲并行拆分、DOP、QC/PX、适用场景和资源代价。不要把并行当成慢 SQL 的万能按钮。