Oracle 并行查询和并行 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 的万能按钮。