首批通过分布式安全可靠测评,为关键业务系统打造
自动并行度 Auto DOP
更新时间:2026-02-14 20:00:28
什么是 Auto DOP
OceanBase 数据库优化器的并行度 DOP(Degree of Parallel)选择策略目前分为 AUTO 模式和 MANUAL 模式。选择 AUTO 模式即为 Auto DOP。
为什么选择 AUTO DOP?
您可以通过 MANUAL 模式手动指定并行度,一种方式是使用系统变量对当前会话中的所有执行查询开启并行执行并指定并行度,但是这样可能会给会话中本不需要并行加速,或者不需要使用较高 DOP 的查询带来额外的并行执行开销,从而导致性能下降;另一种方式是通过 Hint 来指定特定查询的并行度,但这需要对每一条业务查询进行单独考量,对于存在大量业务查询的场景是不可行的。
基于手动指定并行度所带来的不便和限制,AUTO 模式下的优化器可以根据查询实际情况,自动选择开启并行执行,并确定并行度。
OceanBase 数据库查询优化器的 Auto DOP 功能,在生成查询计划时评估查询所需要执行的时间,自动确定是否开启并行以及确定对当前查询合适的并行度,避免了由于手动指定并行度而导致的性能下降问题。
如何开启 Auto DOP 策略?
OceanBase 数据库优化器可以通过系统变量 parallel_degree_policy 可以进行 GLOBAL 和 SESSION 级别的 Auto DOP 选择策略配置,也通过更高优先级的 Hint 进行查询级别的 DOP 选择策略配置。配置方法如下:
/* 在 GLOBAL 级别启用 Auto DOP */
SET global parallel_degree_policy = AUTO;
/* 在 SESSION 级别启用 Auto DOP */
SET session parallel_degree_policy = AUTO;
SET parallel_degree_policy = AUTO;
/* 在 GLOBAL 级别禁止 Auto DOP */
SET global parallel_degree_policy = MANUAL;
/* 在 SESSION 级别禁止 Auto DOP */
SET session parallel_degree_policy = MANUAL;
SET parallel_degree_policy = MANUAL;
/* 使用 Hint 在查询级别启用 Auto DOP */
SELECT /*+PARALLEL(AUTO)*/ * FROM ...;
/* 使用 Hint 在查询级别禁止 Auto DOP */
SELECT /*+PARALLEL(MANUAL)*/ * FROM ...;
SELECT /*+PARALLEL(8)*/ * FROM ...;
Auto DOP 与其它并行开启方式关系
对于开启并行的多种方式,优先级关系详见并行开启方式及优先级。
开启 Auto DOP 后,优化器可以对 SELECT/DELETE/UPDATE/INSERT 等多种操作开启并行,对于 DELETE/UPDATE/INSERT 等数据维护操作,开启并行后会自动使用 PDML,不需要再对 _enable_parallel_dml 进行配置打开 PDML。
如何判断是否需要开启 Auto DOP?
要启用 Auto DOP 功能,需对系统业务负载类型进行评估,并合理配置相关系统变量。否则,其开启可能导致适得其反,给系统带来巨大风险。
Auto DOP 仅基于查询执行成本进行评估,以减小响应时间(RT)为目标来决定是否启用并行处理及计算 DOP。若业务负载中包含对用户不关心的慢查询,则功能开启后这些查询可能会以并行方式执行,并获得较高的并发度。这些查询的并行执行将占用系统并行资源,对其他需要正常并发处理、优化响应时间的查询造成干扰。若这些查询占用过多资源,系统 CPU 负载将急剧上升,严重影响正常业务查询。在这种情况下,需要评估业务负载,采用适当的资源隔离策略进行处理,参考资源隔离概述对资源隔离的介绍 ,再决定是否使用 Auto DOP 功能。
除此之外,Auto DOP 只能优化针对当前查询响应时间(RT)的目标,而不会考虑系统中存在大量需要并发处理的查询场景。因此,在实际业务系统中使用 Auto DOP 功能,需要根据实际优化目标,有针对性地调整相关系统变量,参考下文Auto DOP 使用场景中所介绍的场景 1:查询性能极致优化和场景 2:系统性能优化。
如何干预 Auto DOP 策略下的 DOP 选择行为?
在 Auto DOP 策略下,两个相关系统变量 parallel_degree_limit 和 parallel_min_scan_time_threshold 的值会影响获取的 DOP 大小,在不同部署资源和业务负载条件下需要根据需求进行调整。
设置 parallel_min_scan_time_threshold 参数
系统变量 parallel_min_scan_time_threshold 用于在 Auto DOP 策略中计算并行度的参数,表示对基表扫描开启并行的参考执行时间。当基表扫描评估执行时间超过这个设定值时,会对基表扫描开启并行,并利用这个设定值计算一个合适的并行度。变量默认值设置为 1000,单位为毫秒,最小值为 10。
调小 parallel_min_scan_time_threshold 的值,可以放宽并行扫描的启用条件,使得评估执行时间较短的基表扫描也能利用并行处理,同时对于数据量相对固定的表,实现更高效的并行扫描。
考虑到启用 Auto DOP 可能导致大量查询以高并行度执行,进而大量占用系统资源,该参数默认采用较为谨慎的设置。因此,在启用 Auto DOP 时,应根据系统的实际负载情况适当调整此参数,以确保既能提升查询效率,又不会对系统稳定性造成影响。例如,将 parallel_min_scan_time_threshold 调整至 20 或 10,可以使得某些单表扫描查询的并行度提升至 4 或 6,从而优化查询性能。
配置示例如下:
/* 设置 GLOBAL 级别 Auto DOP 策略的 DOP 最大值 */
SET GLOBAL parallel_degree_limit = 64;
/* 设置 SESSION 级别 Auto DOP 策略的 DOP 最大值 */
SET SESSION parallel_degree_limit = 64;
SET parallel_degree_limit = 64;
/* 设置 GLOBAL 级别 Auto DOP 策略的 DOP */
SET GLOBAL parallel_min_scan_time_threshold = 100;
/* 设置 SESSION 级别 Auto DOP 策略的 DOP */
SET SESSION parallel_min_scan_time_threshold = 100;
SET parallel_min_scan_time_threshold = 100;
应用示例如下:
explain select /*+parallel(auto)*/ * from t1;
-- 设置参数为 20, 最终使用 DOP 为 4, 开启并行后基表扫描评估代价为 12 ms
set parallel_min_scan_time_threshold = 20;
=========================================================
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|
---------------------------------------------------------
|0 |PX COORDINATOR | |512000 |619089 |
|1 |└─EXCHANGE OUT DISTR |:EX10000|512000 |230501 |
|2 | └─PX BLOCK ITERATOR| |512000 |12189 |
|3 | └─TABLE FULL SCAN|t1 |512000 |12189 |
=========================================================
Outputs & filters:
-------------------------------------
0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4)]), filter(nil), rowset=256
1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4)]), filter(nil), rowset=256
dop=4
-- 设置参数为 10, 最终使用 DOP 为 6, 开启并行后基表扫描评估代价为 8 ms
set parallel_min_scan_time_threshold = 10;
=========================================================
|ID|OPERATOR |NAME |EST.ROWS|EST.TIME(us)|
---------------------------------------------------------
|0 |PX COORDINATOR | |512000 |542256 |
|1 |└─EXCHANGE OUT DISTR |:EX10000|512000 |153667 |
|2 | └─PX BLOCK ITERATOR| |512000 |8126 |
|3 | └─TABLE FULL SCAN|t1 |512000 |8126 |
=========================================================
Outputs & filters:
-------------------------------------
0 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4)]), filter(nil), rowset=256
1 - output([INTERNAL_FUNCTION(t1.c1, t1.c2, t1.c3, t1.c4)]), filter(nil), rowset=256
dop=6
设置 parallel_degree_limit 参数
parallel_degree_limit 系统变量用于限制 Auto DOP 允许使用的最大并行度。当设置为 0 时,将不对自动获取的并行度进行限制,这也是默认值。在默认情况下,优化器会根据租户的 CPU 和系统变量 parallel_servers_target 来限制最大并行度。
在系统启用 Auto DOP 后,如果出现大量需要较大并行度的查询,导致系统负载过高,可以通过设置 parallel_degree_limit 进一步限制允许的最大并行度。在这种情况下,可以根据需要将 parallel_degree_limit 设置为小于某个 CPU 值。
在 parallel_min_scan_time_threshold 章节中提到的查询示例,在将 parallel_degree_limit 设置为 4 且 parallel_min_scan_time_threshold 设置为 10 情况下,查询仍然只能使用最大并行度为 4。
Auto DOP 使用场景
Auto DOP 功能允许优化器主动为查询操作启用并行处理,以提升执行效率。然而,并行度的规模受到特定系统变量的制约,因此,在不同的使用场景下,有必要对这些参数进行精细调整以优化性能。
场景 1:查询性能极致优化
在数据库负载较低,即没有其他显著查询压力的情况下,若希望利用租户可用的所有并行资源以实现最佳查询性能,建议将 Auto DOP 的参考执行时间阈值设为最低,并且不对最大 DOP 进行限制。相应的参数设置如下:
ALTER SYSTEM SET parallel_degree_policy = AUTO;
ALTER SYSTEM SET parallel_degree_limit = 0; -- 表示不限制最大 DOP
ALTER SYSTEM SET parallel_min_scan_time_threshold = 10; -- 10 毫秒
此配置将使得优化器在足够低的执行时间阈值下启用并行处理,并尽可能使用最大的 DOP 来加速查询。
场景 2:综合系统性能优化
当数据库大量并发查询负载时,大量查询使用较高 DOP 会导致系统并行资源不足,导致查询队列排队等问题。为了避免大量大并行度查询对系统资源的占用,可以对查询机制性能优化中的参数进行调整:
- 通过降低
parallel_degree_limit的值(设置为小于系统 CPU 核心数的数值),来限制 Auto DOP 使用的最大 DOP。 - 增加
parallel_min_scan_time_threshold的值,以降低并行执行的触发敏感度,减少并行资源的使用率。
例如,若要将最大 DOP 限制为 32,并且仅对评估执行时间超过 20 毫秒的查询启用并行处理,参数配置如下:
ALTER SYSTEM SET parallel_degree_policy = AUTO;
ALTER SYSTEM SET parallel_degree_limit = 32;
ALTER SYSTEM SET parallel_min_scan_time_threshold = 20; -- 20 毫秒
以上配置有助于在系统水平上平衡查询性能和资源分配,优化整体的数据库响应和稳定性。