首批通过分布式安全可靠测评,为关键业务系统打造
设置并行执行参数
更新时间:2026-05-03 15:06:04
OceanBase 数据库提供了一系列参数,用于控制并行执行(Parallel eXecution,PX)的初始化和调优。在 OceanBase 启动时,可以根据租户的 CPU 数量和租户配置项 px_workers_per_cpu_quota 计算出默认的并行执行控制参数。用户也可以选择不使用默认值,在启动时手动指定参数值,并在后期根据实际场景手动调整参数值。并行执行功能默认是开启的。
本文从以下几个方面说明并行执行参数控制技巧:
- 并行执行默认参数
- 并行执行相关参数调优
- 基于实时负载的并行控制
并行执行默认参数
并行执行的参数能够控制并行线程数、并行执行排队等行为。具体总结如下表:
| 参数名称 | 默认值 | 级别 | 说明 |
|---|---|---|---|
| px_workers_per_cpu_quota | 10 | 租户级配置项 | 每个 CPU 上可以分配的并行执行线程数,取值范围 [1,20]。 |
| parallel_servers_target | MIN CPU * px_workers_per_cpu_quota | 租户级变量 | 表示租户在每个节点上可申请的并行执行线程数量。 |
| parallel_degree_policy | MANUAL | 租户级/SESSION 级变量 | 自动 DOP 开启开关,当设置为 AUTO 时,会开启自动 DOP,优化器根据统计信息自动计算 Query 的并行度。当设置为 MANUAL 时,根据 HINT、TABLE PARALLEL 属性、SESSION 级 DOP 等控制并行度。 |
为了降低用户使用并行执行的门槛,OceanBase 将并行执行参数个数降到了最低,使用默认参数即可实现开箱即用。在特殊场景下,用户可以通过改变默认参数来实现应用调优。
px_workers_per_cpu_quota
该参数表示在每个 CPU 上可以分配的并行执行线程数。当分配给租户的 MIN CPU 为 N 时,如果并行负载均匀,那么每个节点上可以分配的线程数为 N * px_workers_per_cpu_quota。如果并行负载访问的数据分布不均匀,某些节点上实际分配的线程数可能在短时间内超过 N * px_workers_per_cpu_quota,当负载结束后,这些多分配的线程会被自动回收。
px_workers_per_cpu_quota 对 parallel_servers_target 默认值的影响仅发生在创建租户时,租户创建完成后,修改 px_workers_per_cpu_quota 的值并不会改变 parallel_servers_target 的值。
一般情况下,不需要更改 px_workers_per_cpu_quota 的默认值。当未开启资源隔离特性时,如果发生并行执行占用了全部 CPU 资源的情况,可以尝试通过降低 px_workers_per_cpu_quota 参数的值来缓解该问题。
parallel_servers_target
该参数表示租户在每个节点上可申请的并行执行线程资源数量。当资源耗尽时,并行执行请求需要排队。关于排队的概念,请参考 并发控制与排队。
并行执行的 CPU 使用率非常低,可能是因为 parallel_servers_target 值太小,导致 SQL 的 DOP 被降级,实际分配的线程数小于期望的数量。
在 OceanBase 数据库 V3.2.3 版本之前,parallel_servers_target 的默认值非常小,可以通过调大 parallel_servers_target 的值来解决,建议设置为 MIN CPU * 10。
在 OceanBase 数据库 V3.2.3 版本起,parallel_servers_target 的默认值为 MIN CPU * 10,一般不会遇到这个问题。
说明
MIN CPU 表示租户的 min_cpu 值,一般在创建租户时指定。
设定好 parallel_servers_target 的值后,重新连接,执行如下命令查看最新值:
SHOW VARIABLES LIKE 'parallel_servers_target';
从运维的角度,为了避免频繁调整,可以给 parallel_servers_target 设置一个最大值。理论上,可以将 parallel_servers_target 设置得无穷大,这时会面临一个问题:低效。所有的查询都不排队,它们都开始执行,并争抢 CPU 时间片、争抢磁盘 IO、网络 IO。
从吞吐量的角度看,这个问题不算严重。从单个 SQL 延迟的角度看,这种争抢会严重影响延迟。综合考虑 CPU 和 IO 的利用率,可以以租户 Unit 的 MIN CPU 为基准,一般把 parallel_servers_target 设置为 MIN CPU * 10 即可;少数 IO 密集型场景,CPU 可能用不满,可以将 parallel_servers_target 设置为 MIN CPU * 20。
parallel_degree_policy
该参数是自动 DOP 开启开关,当设置为 AUTO 时,会开启自动 DOP,优化器根据统计信息自动计算 Query 的并行度。当设置为 MANUAL 时,根据 HINT、TABLE PARALLEL 属性、SESSION 级 DOP 等控制并行度。
在 OceanBase 数据库 V4.2 起,如果用户不熟悉并行度的设置规则,可以设置 parallel_degree_policy 为 AUTO,让优化器帮忙自动选择并行度。关于自动并行度的计算规则,请参考 设置并行度及优先级。
在 OceanBase 数据库 V4.2 之前的版本,不支持 parallel_degree_policy 开关,不支持自动 DOP 功能,需要手动设置。
并行执行相关参数调优
ob_sql_work_area_percentage
租户级变量,用于限制 SQL 模块可以使用的最大内存。它是一个百分值,表示占租户总内存的比值,默认为 5,表示占租户内存的 5%。当 SQL 使用的内存超过限制时,会触发内存落盘。
SQL work area 内存的实际使用量,可以在 observer.log 日志中搜索 WORK_AREA。例如:
[MEMORY] tenant_id=1001 ctx_id=WORK_AREA hold=2,097,152 used=0 limit=157,286,400
在读多写少场景下,如果 SQL 模块内存受限导致数据落盘,可以适当增大 ob_sql_work_area_percentage 的值。
workarea_size_policy
OceanBase 实现了全局自适应的内存管理,当 workarea_size_policy 设置为 AUTO 时,执行框架会以最优的策略为各个算子(如 HashJoin、GroupBy、Sort 等)分配内存,开启自适应的数据落盘策略。
并行 DML 参数调优
OceanBase 数据库 V4.1 起,如果没有事务要求,向表中导入数据时建议使用 INSERT INTO SELECT 加上旁路导入功能,一次性将数据插入到新表。这种方式既可以缩短导入时间,也可以避免写入太快导致内存不足的问题。
OceanBase 数据库 V4.1 之前的版本,如果单条并行 DML 执行时间超过 30 分钟,则需要设置 undo_retention 值,详情请参考 并行执行分类 中的事务处理。
基于实时负载的并行控制
从 OceanBase 数据库 V4.6.0 版本起,系统支持使用节点实时的 PX 任务数作为判断是否有足够资源执行并行查询的依据,并引入以下配置项:
| 参数名称 | 默认值 | 级别 | 说明 |
|---|---|---|---|
px_target_workers_per_cpu |
8 | 组户级 | 用于控制预期的并行执行线程数和租户 CPU 数的比率。 |
px_target_low_watermark |
60 | 组户级 | 用于设置并行线程数的低水位线百分比阈值,超过该阈值时开始对新调度 DFO 的并行度进行降级控制,避免 CPU 资源耗尽。 |
px_target_high_watermark |
80 | 组户级 | 用于控制并行线程数的高水位线百分比阈值。实时负载越接近该水位,并行度降级幅度越大,超过该水位时并行度降为 1。 |
注意
这三个配置项应该满足:px_target_low_watermark <= px_target_high_watermark <= px_target_workers_per_cpu。
注意事项
V4.6.0 及之后版本新建租户场景默认开启实时负载的并行控制,
parallel_servers_target流程的并行控制会失效。如果是升级到 V4.6.0 版本的场景,并行控制默认使用的还是
parallel_servers_target流程。如果要使用实时负载的并行控制能力,需要修改集群级配置项_enable_px_adaptive_dop为true,示例如下:obclient> ALTER SYSTEM SET _enable_px_adaptive_dop = true;