并行 DML(PDML)通过使用并行执行机制来提高对大型数据库的表和索引执行插入、更新、删除等操作,以提高执行效率。OceanBase 数据库支持在 SQL 语句或会话中显式启用并行 DML。不过目前仍存在部分 DML 语法因为批量操作数据时对数据顺序有前后依赖性,所以无法走 PDML 的并发执行。本文主要列出了目前 PDML 的能力清单。
OceanBase 数据库支持如下 SQL 语句的并行执行能力
INSERT INTO SELECT
UPDATE
DELETE
如果表上存在下列索引类型,也需要支持并行执行
局部索引
单分区全局索引
多分区全局索引
唯一索引
OceanBase 数据库不支持以下 SQL 语句使用并行 DML
values 算子目前是无并行度的,所以
insert/replace into ... values语句目前无法支持 PDML,例如。insert /*+ parallel(3) enable_parallel_dml */ into t1 VALUES (1,'a'),(2,'b'),(3,'c');insert into ... select ... from dual不支持并行执行,例如。insert /*+ parallel(3) enable_parallel_dml */ into t1 select 1,'a' from dual;insert into ... on duplicate key update,例如。explain extended insert /*+ enable_parallel_dml parallel(3) */ into t1 values(1,1),(2,2) on duplicate key update c1=100;insert ignore into ...,例如。insert /*+ append enable_parallel_dml parallel(3) */ ignore into t2 select * from t1;insert into ... select ...语句中为自增列指定了值,并且自增列是主键或者分区键时,不支持 PDML,例如。create table t1 (c1 int auto_increment primary key, c2 int, c3 int); create table t2 (c1 int, c2 int, c3 int); -- 不支持 PDML。 insert /*+ enable_parallel_dml parallel(3) */ into t1 select * from t2; -- 支持 PDML。 insert /*+ enable_parallel_dml parallel(3) */ into t1(c2, c3) select c2, c3 from t2; drop table t1; create table t1 (c1 int auto_increment, c2 int, c3 int); -- 支持 PDML。 insert /*+ enable_parallel_dml parallel(3) */ into t1 select * from t2; drop table t1; create table t1 (c1 int auto_increment unique key, c2 int, c3 int); -- 支持 PDML。 insert /*+ enable_parallel_dml parallel(3) */ into t1 select * from t2; drop table t2; create table t2 (c1 int, c2 int); create table t3 (id bigint(10) AUTO_INCREMENT PRIMARY KEY, c1 int); -- 不支持 PDML。 insert /*+enable_parallel_dml parallel(10)*/ into t3 select * from t2;merge into ...更新主键或唯一键,例如。-- col2 为 tbl1 的唯一键。 explain extended merge /*+ enable_parallel_dml parallel(3) */ into tbl1 using tbl2 on (tbl1.col1 = tbl2.col1) when matched then update set tbl1.col2 = tbl2.col2;不支持多表 DML 语句,例如。
-- FIRST:找到第一个满足条件的分支后,将数据插入该分支对应的表,不会再继续检查剩余分支的条件是否满足。 insert /*+ parallel(3) enable_parallel_dml */ first when num = 1 then into t1 (num, name, money) when num <= 4 then into t2 (num, name, money) select * from t3; -- ALL:遍历所有匹配条件的分支,只要满足条件就会将数据插入对应的表。 insert /*+ parallel(3) enable_parallel_dml */ all into t1 (num, name,money,pk_id) into t2 (num, name,money,pk_id) select PK_COL,COL1,COL2,COL3 from t3;
如果表上存在如下属性,也不支持并行 DML
触发器
外键
CHECK 约束
带 UDF(User Defined Function)的 DML 执行要求运算必须串行的发生本地,无法走 PDML
备注
可以通过 explain extended ... 输出结果中的 Note 一节查看一条 DML 语句没有走 PDML 的常见原因如下。
- PDML disabled because modify more than one target table in parallel is not supported yet。
- PDML disabled because it is an insert-on-duplicate-key-update query。
- PDML disabled because it is an dml ignore query。
- PDML disabled because the merge statement update primary key or unique index key。
- PDML disabled because the modified table has trigger。
- PDML disabled because the modified table has foreign key/trigger/user defined function。
- PDML disabled because it is an dml ignore query。
- PDML disabled because the insert statement primary key has specified auto-increment column。
适用版本
OceanBase 数据库 V3.x、V4.x 版本。