在Oracle数据库中,并行度(Parallel Degree) 是用于控制并行处理任务的关键配置,旨在通过多进程协作加速大规模数据处
一、并行度的核心概念
并行度(DOP, Degree of Parallelism) 表示一个操作同时使用的并行进程数。适用于:
-
查询(SELECT):全表扫描、JOIN操作、聚合计算。
-
DML操作:批量插入、更新、删除。
-
DDL操作:创建索引、表重建、数据泵导入导出
二、并行度的配置方式
1. 对象级别并行度
-
表/索引默认并行度:
-- 设置表的并行度
ALTER TABLE tmp_01 PARALLEL 8;
-- 查看表并行度
SELECT table_name, degree FROM user_tables WHERE table_name = upper('tmp_01');
-- 移除并行度 ALTER TABLE t_prem_arap_tmp_01 NOPARALLEL;
2. 操作级别并行度(Hints)
在SQL中指定:
SELECT /*+ PARALLEL(e, 8) */ * FROM employees e;
3. 实例级别参数
关键参数:
SHOW PARAMETER parallel_max_servers; -- 最大并行进程数
SHOW PARAMETER parallel_servers_target; -- 系统自动分配的并行进程目标
SHOW PARAMETER parallel_threads_per_cpu; -- 每个CPU的并行线程数(默认为2)
三、并行度的执行机制
1. 并行进程分配
-
生产者(QC, Query Coordinator):协调并行任务,分配工作单元。
-
消费者(PX Servers):执行实际任务的并行进程。
-
进程数计算:
实际进程数 = DOP × 2(例如,DOP=4 时,需要8个进程)。
2. 数据分片(Granule)
-
块范围分片:按数据块范围分配任务(全表扫描)。
-
分区级分片:按分区分配任务(分区表更高效)。
四、并行度的优化策略
1. 自动并行度(Auto DOP, Oracle 12c+)
ALTER SYSTEM SET parallel_degree_policy = AUTO;
根据对象大小、系统负载和资源动态调整DOP。
2. 手动调优建议
-
CPU资源:DOP不超过CPU核心数 ×
parallel_threads_per_cpu
。 -
数据量:
-
小表(< 1GB):DOP=1(禁用并行)。
-
大表(> 10GB):DOP=4~16(根据硬件调整)
-
3. 避免资源争用
监控并行进程:
SELECT sid, serial#, qcsid, qcserial#, degree, req_degree
FROM v$px_session
WHERE qcsid IS NOT NULL;
-
sid
: 并行服务器进程的会话ID -
qcsid
: 协调进程(Query Coordinator)的会话ID -
degree
: 实际使用的并行度 -
req_degree
: 请求的并行度
调整参数:
限制并行进程数以防资源耗尽:
ALTER SYSTEM SET parallel_max_servers = 160; -- 根据总内存和CPU调整
五、并行度的应用场景
场景 | 推荐配置 | 示例 |
---|---|---|
数据仓库查询 | 高DOP(8~16) | 大规模聚合、星型查询 |
批量数据加载 | 中高DOP(4~8) | SQLLoader、INSERT /+ APPEND */ |
OLTP系统 | 禁用或低DOP(1~2) | 高并发事务,避免资源争用 |
索引创建 | DOP=CPU核心数 | CREATE INDEX ... PARALLEL 8; |
六、常见问题与解决方案
1. 并行执行效率低
-
原因:资源争用(CPU、I/O)、数据倾斜。
解决:
-
监控
V$SQL_MONITOR
查看执行瓶颈。 -
使用分区表减少数据倾斜。
2. 并行进程无法启动
-
原因:
parallel_max_servers
不足或参数配置错误。
ALTER SYSTEM SET parallel_max_servers = 200; -- 增加并行进程上限
3. 锁冲突
ALTER SESSION ENABLE PARALLEL DML; -- 启用并行DML
COMMIT; -- 及时提交释放锁