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. 最佳实践

  1. 大表用并行:性能
  2. OLTP 慎用:影响
  3. 自动 DOP(11g+):简化
  4. 并行队列:防过载
  5. PARALLEL_MAX_SERVERS:限制
  6. HASH JOIN 配合:高效
  7. DML 需 ENABLE:会话
  8. NOLOGGING 加速:批量
  9. 监控进程:健康
  10. 测试 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