基于湖库一体架构,统一管理结构化、半结构化与非结构化等多模态数据,一个系统承载事务处理、实时分析与 AI 工作负载。
更新时间:2026-07-28
本文介绍 OceanBase 数据库处理大规模 DML 操作(INSERT/UPDATE/DELETE)的最佳实践,重点关注使用 PDML 的性能优化策略,以及数据库侧的配置建议。PDML(Parallel Data Manipulation Language,并行数据操作语言)是 OceanBase 数据库提供的一种高性能数据处理技术,主要用于加速大规模数据的 INSERT、UPDATE 和 DELETE 操作。通过将数据操作任务分解并分配给多个并行执行单元,PDML 可以提高数据操作的吞吐量和效率。
PDML 通过以下机制提高性能:
OceanBase 数据库提供了四种开启 PDML 的方式:
SQL 语句 Hint 指定并行度
通过在 SQL 语句中添加 Hint 来指定并行度。
DELETE /*+ enable_parallel_dml parallel(4) */ FROM table_name WHERE condition;
UPDATE /*+ enable_parallel_dml parallel(8) */ table_name SET column_name = value WHERE condition;
INSERT /*+ enable_parallel_dml parallel(6) */ INTO target_table SELECT * FROM source_table WHERE condition;
其中,enable_parallel_dml 用于启用 PDML,parallel(N) 用于指定并行度。
适用场景: 适用于临时性的、对单条 SQL 语句的性能调优,不影响其他操作。例如,对某个特定查询或数据修改操作进行快速优化。
会话级设置并行度
在会话级别设置并行度,影响当前会话中的所有后续 DML 操作。
MySQL 模式下:
SET _force_parallel_query_dop = 3;
SET _force_parallel_dml_dop = 3;
-- 此后的 DML 语句将自动应用并行处理
DELETE FROM table_name WHERE column_name = 'EXPIRED';
Oracle 模式下:
ALTER SESSION FORCE PARALLEL QUERY PARALLEL 3;
ALTER SESSION FORCE PARALLEL DML PARALLEL 3;
-- 此后的 DML 语句将自动应用并行处理
DELETE FROM table_name WHERE column_name = 'EXPIRED';
-- 关闭 session 级别的并行
ALTER SESSION DISABLE PARALLEL QUERY;
适用场景: 适用于需要在单个会话中执行多个并行 DML 操作的批处理作业。例如,ETL 过程中,需要在同一个会话中执行多个数据转换和加载操作。
自动并行度(Auto DOP)
启用自动并行度,让数据库根据系统资源和负载情况自动调整并行度。
/* 在 GLOBAL 级别启用 Auto DOP */
SET global parallel_degree_policy = AUTO;
/* 在 SESSION 级别启用 Auto DOP */
SET session parallel_degree_policy = AUTO;
SET parallel_degree_policy = AUTO;
/* 使用 Hint 在查询级别启用 Auto DOP */
SELECT /*+PARALLEL(AUTO)*/ * FROM ...;
适用场景: 适用于数据库自动优化并行度的场景,无需人工指定。例如,在资源充足的情况下,数据库可以自动增加并行度以提高查询速度。
表级并行度设置
在表创建或修改时指定默认并行度。
CREATE TABLE sales_history (
id INT PRIMARY KEY,
sale_date DATE,
amount DECIMAL(10,2)
) parallel 8;
-- 或修改现有表
ALTER TABLE customer_data parallel 6;
当您对指定了并行度的表执行 DML 操作且未显式禁用并行时,OceanBase 数据库会自动使用 PDML。
适用场景: 适用于经常需要批量处理的大表,可以长期提升 DML 性能。例如,对于一个经常需要进行数据清洗和转换的大型日志表,可以设置表级并行度以提高处理效率。
并行开启方式优先级由高到低的顺序如下:
某平台每天产生大量的订单数据,随着时间的推移,历史订单数据量越来越大,导致查询性能下降。为了提高查询效率,并降低存储成本,平台决定将超过一年的历史订单数据归档到历史表中。
使用 OceanBase 数据库的 PDML 技术,并行执行数据归档操作。
创建历史表: 创建与订单表结构相同的历史表 order_history,用于存储归档数据。
CREATE TABLE order_history LIKE orders;
开启 PDML: 使用表级并行度设置,为订单表启用 PDML。
ALTER TABLE orders parallel 8;
执行数据归档: 使用 INSERT INTO ... SELECT 语句将历史数据从订单表迁移到历史表,并使用 DELETE 语句删除订单表中的历史数据。
INSERT /*+ enable_parallel_dml parallel(8) */ INTO order_history
SELECT * FROM orders WHERE order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
DELETE /*+ enable_parallel_dml parallel(8) */ FROM orders
WHERE order_date < DATE_SUB(CURDATE(), INTERVAL 1 YEAR);
监控归档进度: 通过 OceanBase 数据库的监控工具,监控 PDML 的执行进度和资源使用情况。