Oracle 并行查询(Parallel Query)
Oracle 并行查询(Parallel Query)
适用版本:Oracle Database 10g / 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07
1. 概述
并行查询(Parallel Query) 使用多个进程并行执行 SQL[1]:
适合:
- 大表扫描
- 大表 JOIN
- 批量 DML
- 索引创建
2. 启用并行
2.1 对象级
-- 表
ALTER TABLE employees PARALLEL 4;
-- 索引
ALTER INDEX idx_emp PARALLEL 4;
-- 取消
ALTER TABLE employees NOPARALLEL;
2.2 会话级
ALTER SESSION FORCE PARALLEL QUERY PARALLEL 4;
ALTER SESSION ENABLE PARALLEL DML;
ALTER SESSION ENABLE PARALLEL DDL;
2.3 HINT
-- 查询
SELECT /*+ PARALLEL(e 4) */ * FROM employees e;
-- 多表
SELECT /*+ PARALLEL(e 4) PARALLEL(d 2) */ *
FROM employees e, departments d
WHERE e.dept_id = d.id;
-- NO_PARALLEL
SELECT /*+ NO_PARALLEL(e) */ * FROM employees e;
2.4 DML
-- 启用并行 DML
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ PARALLEL(e 4) */ INTO employees e
SELECT /*+ PARALLEL(s 4) */ * FROM employees_source s;
3. 并行度(DOP)
3.1 计算
DOP = CPU 数 × PARALLEL_THREADS_PER_CPU
3.2 手动指定
PARALLEL 4 -- 固定 DOP 4
PARALLEL (table 4) -- 指定表
3.3 自动 DOP(11g+)
ALTER SYSTEM SET parallel_degree_policy = AUTO SCOPE=SPFILE;
-- AUTO: 自动 DOP + 并行语句队列 + 内存自动
-- MANUAL: 手动(默认)
-- LIMITED: 仅自动 DOP
4. 并行操作
4.1 并行查询
SELECT /*+ PARALLEL(4) */
dept_id,
COUNT(*),
AVG(salary)
FROM employees
GROUP BY dept_id;
4.2 并行 DML
ALTER SESSION ENABLE PARALLEL DML;
-- INSERT
INSERT /*+ PARALLEL(4) */ INTO big_table
SELECT /*+ PARALLEL(4) */ * FROM source_table;
-- UPDATE
UPDATE /*+ PARALLEL(4) */ big_table SET col = ...;
-- DELETE
DELETE /*+ PARALLEL(4) */ FROM big_table WHERE ...;
4.3 并行 DDL
-- 创建索引
CREATE INDEX idx_emp ON employees(last_name) PARALLEL 4;
-- 重建表
ALTER TABLE employees MOVE PARALLEL 4;
4.4 并行恢复
RECOVER DATABASE PARALLEL 4;
5. 并行执行机制
5.1 进程
- QC(Query Coordinator):协调进程
- PX(Parallel Execution Slaves):工作进程
5.2 数据分发
| 方式 | 说明 |
|---|---|
| HASH | 哈希分发(默认 JOIN) |
| RANGE | 范围分发 |
| BROADCAST | 广播 |
| ROUND-ROBIN | 轮询 |
| PARTITION | 分区 |
5.3 生产者/消费者
生产者 → 表队列 → 消费者
(扫描) (处理)
6. 查看
6.1 并行进程
SELECT
sid,
serial#,
qcsid, -- QC SID
server_group,
server_set,
degree
FROM v$px_session;
6.2 并行参数
SHOW PARAMETER parallel
6.3 并行执行统计
SELECT * FROM v$px_process_sysstat;
7. 关键参数
7.1 PARALLEL_MAX_SERVERS
ALTER SYSTEM SET parallel_max_servers = 32;
-- 最大并行进程数
7.2 PARALLEL_MIN_SERVERS
ALTER SYSTEM SET parallel_min_servers = 4;
-- 最小(保持就绪)
7.3 PARALLEL_SERVERS_TARGET
-- 队列阈值
ALTER SYSTEM SET parallel_servers_target = 24;
7.4 PARALLEL_DEGREE_LIMIT
ALTER SYSTEM SET parallel_degree_limit = 'CPU';
-- CPU / IO / 数值
7.5 PARALLEL_FORCE_LOCAL
-- RAC 仅本地节点
ALTER SYSTEM SET parallel_force_local = TRUE;
8. 并行语句队列(11g+)
8.1 启用
ALTER SYSTEM SET parallel_degree_policy = AUTO;
8.2 工作原理
- DOP 总和超过阈值时排队
- 防止资源耗尽
8.3 查看
SELECT sql_text, degree, req_degree
FROM v$sql_monitor
WHERE parallel = 'YES';
9. 内存管理
9.1 PX 内存
-- 工作区
SELECT * FROM v$sysstat WHERE name LIKE '%parallel%';
9.2 调整
ALTER SYSTEM SET pga_aggregate_target = 8G;
-- 或 12c+
ALTER SYSTEM SET pga_aggregate_limit = 16G;
10. 应用场景
10.1 大表统计
SELECT /*+ PARALLEL(8) */
product_id,
SUM(quantity) AS total_qty,
SUM(amount) AS total_amt
FROM sales
WHERE sale_date >= TRUNC(SYSDATE, 'YYYY')
GROUP BY product_id;
10.2 大表 JOIN
SELECT /*+ PARALLEL(s 8) PARALLEL(p 4) USE_HASH(s p) */
p.product_name,
SUM(s.amount)
FROM sales s, products p
WHERE s.product_id = p.id
AND s.sale_date >= ADD_MONTHS(SYSDATE, -12)
GROUP BY p.product_name;
10.3 批量加载
ALTER SESSION ENABLE PARALLEL DML;
INSERT /*+ PARALLEL(8) APPEND */ INTO big_table
SELECT /*+ PARALLEL(8) */ * FROM external_table;
COMMIT;
10.4 索引创建
CREATE INDEX idx_big ON big_table(col) PARALLEL 8 NOLOGGING;
11. 常见坑与排错
11.1 并行未使用
-- 1. 检查执行计划
EXPLAIN PLAN FOR SELECT /*+ PARALLEL(4) */ ...;
SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY);
-- 2. 检查 HINT 语法
-- 3. 检查对象 PARALLEL 属性
11.2 并行进程不足
-- 1. 检查 PARALLEL_MAX_SERVERS
SHOW PARAMETER parallel_max_servers
-- 2. 查看并行进程
SELECT COUNT(*) FROM v$px_process;
11.3 性能反而变差
-- 1. 小表不适合并行
-- 2. DOP 过高
-- 3. 资源竞争
-- 4. OLTP 不推荐
11.4 内存不足
-- 增大 PGA
ALTER SYSTEM SET pga_aggregate_target = 16G;
12. 最佳实践
- 大表用并行:性能
- OLTP 慎用:影响
- 自动 DOP(11g+):简化
- 并行队列:防过载
- PARALLEL_MAX_SERVERS:限制
- HASH JOIN 配合:高效
- DML 需 ENABLE:会话
- NOLOGGING 加速:批量
- 监控进程:健康
- 测试 DOP:选择最优
13. 参考资料
[1] Oracle Database VLDB and Partitioning Guide 19c, “Parallel Execution” https://docs.oracle.com/en/database/oracle/oracle-database/19/vldbg/parallel-exec-intro.html