首批通过分布式安全可靠测评,为关键业务系统打造
并行 DML(PDML) 性能不及预期的问题
更新时间:2026-06-23 08:06
适用版本
OceanBase 数据库所有版本。
问题现象
为了提升 INSERT 的性能,在 INSERT 语句中使用 PDML Hint /*+ enable_parallel_dml parallel(16)*/。但却发现使用 PDML 的性能提升非常有限,没达到预期。
insert/*+ enable_parallel_dml parallel(16)*/ into tb_target
select * from tb_source;
SQL 执行时查询 PX 线程统计表 __all_virtual_px_worker_stat,看到有 16 个 PX 线程,符合预期。

根据 trace_id 搜索 observe.log,发现有大量的 WARN 日志,其中有 serialize object failed 和 fill mutator log cost too much time。

问题原因
INSERT 的表 tb_target 上有唯一索引,无法使用 PDML。系统表 __all_virtual_px_worker_stat 中显示有 16个 PX 线程,用于执行 tb_source 上的 SELECT,并不是用于 tb_target 上的 INSERT。
解决方法
删除 tb_target 上的唯一索引,就可以使用 PDML 了。
并行 DML 的使用说明
OceanBase 数据库支持如下 SQL 语句的并行执行能力:
- INSERT INTO SELECT
- UPDATE
- DELETE
OceanBase 数据库不支持以下 SQL 语句使用并行 DML:
- REPLACE
- INSERT INTO ON DUPLICATE KEY UPDATE
- 不支持多表 DML 语句
如果表上存在如下属性,也不支持并行 DML:
- 触发器
- 外键
- CHECK 约束
- 唯一索引
有关详细的 PDML 并行 DML 能力列表清单,请参考文档 PDML 并行 DML 能力列表清单