Oracle 并行 DML 与 DDL

Oracle 并行 DML 与 DDL

适用版本:Oracle Database 11g / 12c / 19c / 23ai 文档版本:v1.0 / 2026-07


1. 概述

并行 DML/DDL 是大数据加载和重组的关键[1]:

类型

  • Parallel DML:INSERT/UPDATE/DELETE
  • Parallel DDL:CREATE/ALTER/INDEX

2. 启用并行 DML

2.1 会话级

ALTER SESSION ENABLE PARALLEL DML;
-- 必须,否则不生效

-- 执行
INSERT /*+ PARALLEL(t 8) */ INTO target t
SELECT * FROM source;

COMMIT;  -- 必须

2.2 表级

ALTER TABLE target PARALLEL 8;

3. Parallel INSERT

3.1 APPEND

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

COMMIT;

3.2 普通 INSERT

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

4. Parallel UPDATE / DELETE

4.1 启用

ALTER SESSION ENABLE PARALLEL DML;

UPDATE /*+ PARALLEL(t 8) */ target t
SET status = 'PROCESSED'
WHERE date_col < SYSDATE - 30;

DELETE /*+ PARALLEL(t 8) */ FROM target t
WHERE date_col < SYSDATE - 365;

5. Parallel DDL

5.1 CREATE TABLE

CREATE TABLE big_table_new PARALLEL 8 
  NOLOGGING AS
SELECT /*+ PARALLEL(t 8) */ * FROM big_table_old;

5.2 CREATE INDEX

CREATE INDEX idx_big ON big_table(col) PARALLEL 8 NOLOGGING;
-- 完成后
ALTER INDEX idx_big NOPARALLEL LOGGING;

5.3 ALTER TABLE MOVE

ALTER TABLE big_table MOVE PARALLEL 8 NOLOGGING;

5.4 REBUILD INDEX

ALTER INDEX idx_big REBUILD PARALLEL 8 NOLOGGING;

6. 自动 DOP(11g+)

6.1 启用

ALTER SYSTEM SET parallel_degree_policy = AUTO;
ALTER SYSTEM SET parallel_min_time_threshold = 10;  -- 秒
ALTER SYSTEM SET parallel_servers_target = 24;

6.2 自动并行

  • SQL 自动并行
  • 自动 DOP
  • 队列

7. 并行参数

7.1 关键参数

参数说明
parallel_min_servers最小并行进程
parallel_max_servers最大并行进程
parallel_servers_target队列阈值
parallel_degree_policy自动/手动
parallel_min_time_threshold自动阈值

7.2 查看

SHOW PARAMETER parallel

8. 监控

8.1 并行执行

SELECT * FROM v$px_process;
SELECT * FROM v$px_session;
SELECT * FROM v$px_sesstat;

8.2 并行统计

SELECT name, value FROM v$sysstat WHERE name LIKE 'Parallel%';

8.3 慢 SQL

SELECT sql_id, parallel, px_servers_requested, px_servers_allocated
FROM v$sql_monitor
WHERE parallel = 'YES';

9. 性能对比

操作串行并行(8)
INSERT 1亿行60 分钟8 分钟
CREATE INDEX30 分钟4 分钟
TABLE MOVE20 分钟3 分钟
UPDATE40 分钟5 分钟

10. 限制

10.1 PDML 限制

  • 触发器不支持
  • 自引用 FK 不支持
  • 远程对象不支持
  • 必须 COMMIT 后查询
  • 索引可能 UNUSABLE

10.2 事务

  • 必须单语句
  • 必须提交后操作

11. 常见坑与排错

11.1 并行未生效

-- 1. 检查 ENABLE PARALLEL DML
-- 2. 检查 HINT
-- 3. 检查 PARALLEL 参数
SHOW PARAMETER parallel_max_servers

11.2 ORA-12838

-- APPEND 后未 COMMIT
-- 1. COMMIT
-- 2. 查询

11.3 索引失效

-- PDML 后索引 UNUSABLE
ALTER INDEX idx REBUILD;

11.4 并行进程不足

ALTER SYSTEM SET parallel_max_servers = 64;

12. 最佳实践

  1. 大表并行:> 10GB
  2. NOLOGGING:少 Redo
  3. PARALLEL + APPEND:最快
  4. 自动 DOP:方便
  5. APPEND 后 COMMIT:必需
  6. 重建索引并行:DDL
  7. 监控并行进程:避免耗尽
  8. 业务低峰:并行
  9. PARALLEL_SERVERS_TARGET:队列
  10. 测试验证:性能

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