首批通过分布式安全可靠测评,为关键业务系统打造
重整数据 DDL 的执行速度优化
更新时间:2026-05-21 09:16
OceanBase 数据库 V4.x.x 版本所支持的重整数据相关 DDL 包括如下:
- 索引构建
- 主键操作
- 修改列类型
- 修改字符集
- 修改分区规则
- 删除列
- 中间添加列
- 修改列顺序
适用版本
OceanBase 数据库 V4.x.x
优化方法
OceanBase 数据库支持如下方式来加快重整数据 DDL 的执行速度。
注意
本文所涉及的参数调整会导致 DDL 占用大量的资源,适用于最大化 DDL 执行速度的场景,不适用于有业务流量的场景。
设置并行度
对于 OceanBase 数据库 V4.x 及之后的版本,DDL 默认是串行执行的,可以通过
SESSION级别的变量来控制并行度,但是所有 DDL 的并行度加起来不超过租户的max_cpu上限。需要注意的是,针对 OceanBase 数据库 V4.1.0 BP3 之前的版本,由于临时文件实现上的限制,建议所有 DDL 的并行度加起来不超过 64。
并行度的设置方法如下:
- MySQL 模式示例:
SET SESSION _force_parallel_ddl_dop = 8; - Oracle 模式示例:
ALTER SESSION FORCE PARALLEL DDL PARALLEL 8;
一般在调整并行度之后,也需要调整相应的
parallel_servers_target值,该值比所有并行度之和大即可。如果并行度为 80,则可设置parallel_servers_target的值为 100,示例如下:SET GLOBAL parallel_servers_target = 100; //设置每个 OBServer 节点上的并行查询排队条件删除列操作是借助 DAG 来调度完成的,因此在调整上述设置并行度参数的同时需要调整 DAG 的并行度,语法为:
ALTER SYSTEM SET ddl_thread_score = INT_VALUE TENANT = 'tenant_name';(OceanBase 数据库 V4.1.0 BP3 和 V4.2.1 及之后版本开始支持该参数)。在设置参数
ddl_thread_score之前查看默认值,命令如下:MySQL [oceanbase]> show parameters like '%ddl_thread_score%';输出结果如下:
+-------+----------+--------------+----------+------------------+-----------+-------+-----------------------------------------------------------------------------------------------------------+----------+--------+---------+-------------------+ | zone | svr_type | svr_ip | svr_port | name | data_type | value | info | section | scope | source | edit_level | +-------+----------+--------------+----------+------------------+-----------+-------+-----------------------------------------------------------------------------------------------------------+----------+--------+---------+-------------------+ | zone1 | observer | xx.xxx.x.xxx | 44000 | ddl_thread_score | INT | 0 | the current work thread score of ddl thread. Range: [0,100] in integer. Especially, 0 means default value | OBSERVER | TENANT | DEFAULT | DYNAMIC_EFFECTIVE | | zone2 | observer | xx.xxx.x.xxx | 44002 | ddl_thread_score | INT | 0 | the current work thread score of ddl thread. Range: [0,100] in integer. Especially, 0 means default value | OBSERVER | TENANT | DEFAULT | DYNAMIC_EFFECTIVE | +-------+----------+--------------+----------+------------------+-----------+-------+-----------------------------------------------------------------------------------------------------------+----------+--------+---------+-------------------+ 2 rows in set (0.01 sec)可知参数
ddl_thread_score配置项默认为 0,表示使用内部默认值 2 作为并行度。参数
ddl_thread_score的说明:参数
ddl_thread_score描述的是删除列执行的并行度,注意此处的score理解为一个并行度。当机器可支持核数一定场景下,是有可能会挤压到其他模块的(如合并速度等),一般设置为 8 可满足大部分的要求。参数
ddl_thread_score只影响删列执行并行度,同时参数ddl_thread_score也是租户级别的,不恢复原设置的话,修改之后租户下的删除列操作都将以此作为执行的并行度,如设置为 8 则后续删列继续以 8 并行度执行。恢复参数
ddl_thread_score的默认值。ALTER SYSTEM SET ddl_thread_score = 0 TENANT = 'tenant_name';
- MySQL 模式示例:
关闭 IO 和网络限流
关闭 IO 限流的语法示例如下,示例中为建议值。
ALTER RESOURCE UNIT unit_name max_iops=100000000, min_iops=100000000;需要注意的是,OceanBase 数据库 V4.1.0 BP3 和 V4.2.1 及之后版本开始默认不限制 IOPS,即无需设置 IOPS 值。
关闭网络限流的语法示例如下,示例中为建议值。
ALTER SYSTEM SET sys_bkgd_net_percentage = 100; //设置后台系统任务可占用网络带宽百分比
调大 IO 线程数
调大 IO 线程数的语法示例如下,示例中为建议值。
ALTER SYSTEM SET _io_callback_thread_count = 32 TENANT = 'tenant_name'; //设置数据解压的 IO 线程 ALTER SYSTEM SET disk_io_thread_count = 32 TENANT='tenant_name'; //设置磁盘 IO 线程数(必须为偶数)调大排序可用内存上限
调大排序可用内存上限的语法示例如下,一般调整到 80 即可。
SET GLOBAL ob_sql_work_area_percentage = 80; //设置 SQL 执行的租户内存百分比限制调大临时文件的缓存上限
调大临时文件的缓存上限的语法示例如下,建议调整到 10% 即可。
ALTER SYSTEM SET _temporary_file_io_area_size = '10' TENANT = 'tenant_name';
通过上述方式调整参数后,观察 DDL 执行的机器上的 CPU 和 IO 资源利用率是否接近配置的并发度,以及所占用的资源是否符合预期。