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 INDEX | 30 分钟 | 4 分钟 |
| TABLE MOVE | 20 分钟 | 3 分钟 |
| UPDATE | 40 分钟 | 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. 最佳实践
- 大表并行:> 10GB
- NOLOGGING:少 Redo
- PARALLEL + APPEND:最快
- 自动 DOP:方便
- APPEND 后 COMMIT:必需
- 重建索引并行:DDL
- 监控并行进程:避免耗尽
- 业务低峰:并行
- PARALLEL_SERVERS_TARGET:队列
- 测试验证:性能
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