首批通过分布式安全可靠测评,为关键业务系统打造
Auto DOP
更新时间:2026-04-10 12:01:00
为了加速查询并满足业务需求,通常以并行执行来优化查询时间。那么,并行资源为多少才合适呢?在优化器中,并行资源量可以使用并行度(DOP:Degree of Parallel)来描述,在实际业务场景中,并行是否开启及并行度大小,根据查询的执行实际情况和业务需求以经验为基础来决定。
在人为指定并行度时,可以通过系统变量对当前会话中的所有执行查询开启并行,并指定并行度。然而,这对会话中本不需要并行加速或无需使用较高 DOP 的查询带来额外的并行执行开销,从而导致性能下降。另一方面,可以通过 hint 的方式来指定特定查询的并行度,但这需要对每一条业务查询进行单独考量,对于存在大量业务查询的情况,是不可行的。
为了解决手动指定并行度的不便和限制,查询优化器可以通过 Auto DOP 功能在生成查询计划时评估查询需要执行的时间,自动确定是否开启并行和开启适量的并行度。这样可以避免由于手动指定并行度而导致的性能下降。
注意
- 开启 Auto DOP 后,需要关注调整 parallel_min_scan_time_threshold 和 parallel_degree_limit 两个相关参数的设置,否则 Auto DOP 可能对 AP 系统有不良影响。
- Auto DOP 仅根据评估的查询执行开销,以减小 RT 为目标决策开启并行并计算 DOP,如果业务负载中存在用户不关注的慢查询,需要使用资源隔离手段进行处理,否则开启 Auto DOP 后,对所有查询使用 Auto DOP 给定并行度,将对系统造成不良影响。
开启 Auto DOP
优化器的 DOP 选择策略目前分为 AUTO 模式和 MANUAL 模式。AUTO 模式下优化器可以根据查询实际情况,自动选择开启并行,并确定并行度。MANUAL 模式仅能通过人为干预开启并行。
优化器的 DOP 选择策略有两种控制方式,可以通过系统变量 parallel_degree_policy 进行全局或 session 级别的 DOP 选择策略配置,也通过更高优先级的 hint 进行查询级别的 DOP 选择策略配置。
使用系统变量开启 Auto DOP
注意
参数类型为系统变量,全局级别修改变量后,只有新建连接可以生效,已有连接需要断连。
-- 在全局级别启用 Auto DOP
set global parallel_degree_policy = AUTO;
-- 在 session 级别启用 Auto DOP
set session parallel_degree_policy = AUTO;
set parallel_degree_policy = AUTO;
-- 在全局级别关闭 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
Hint 相比系统变量有更高的优先级,可以在查询级别控制开启/关闭 Auto DOP。
-- 使用 hint 在查询级别启用 Auto DOP
select /*+parallel(auto)*/ * from t1;
-- 使用 hint 在查询级别关闭 Auto DOP
select /*+parallel(manual)*/ * from t1;
select /*+parallel(8)*/ * from t1;
相关参数设置
Auto DOP 计算查询 DOP 时,最终给定的 DOP 大小受下面两个系统变量影响。在不同部署资源和业务负载条件下,也可以通过调整这两个参数干预 Auto DOP 行为。
注意
参数类型为系统变量,全局级别修改变量后,只有新建连接可以生效,已有连接需要断连。
parallel_min_scan_time_threshold
parallel_min_scan_time_threshold 用于设置对基表扫描开启并行的门限值,影响是否对查询开启并行和使用 DOP 的大小。参数单位为 ms,默认值为 1000,最小值为 10。
使用场景:
调整参数大小,控制 AP 系统中开启并行查询的数量与使用的并行度。开启 Auto DOP 后,如果部分关注的查询没有开启并行,或使用并行度较小且没有达到并行度的上限,可以调小 parallel_min_scan_time_threshold 的设定值,调整后会有更多查询开启并行,已开启并行的查询也可能使用更大并行度。相反情况,可以调大参数设定值。
为避免开启 Auto DOP 后大量查询以较高并行度开启并行、占用系统过多资源,参数默认值较为保守,开启 Auto DOP 一般需要评估系统负载情况,将参数调小到合适值。
示例:
-- 设置当前 session 基表扫描开启并行的评估代价门限值为 10ms
set parallel_min_scan_time_threshold = 10;
-- 设置全局基表扫描开启并行的评估代价门限值为 10ms
set global parallel_min_scan_time_threshold = 10;
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 后能够使用的最大 DOP。默认值为 0,此时优化器会根据租户CPU 和系统变量 parallel_servers_target 限制最大 DOP。
使用场景:
AP 系统中开启 Auto DOP 后,如果出现大量需要使用较大并行度的查询,导致系统负载过高,可以通过设置 parallel_degree_limit 进一步限制允许的最大 DOP,此时根据需要将 parallel_degree_limit 设置为小于 CPU 的某个值。
系统中只有单条 AP 查询执行时,parallel_degree_limit 为默认值,查询最大只能使用 CPU 数的并行度。如果有需要在 Auto DOP 下使用更大并行度,可以将 parallel_degree_limit 设为大于 CPU 数的值,解除 CPU 数对 DOP 的限制。这种调整仅限在单条 AP 查询极致性能优化时使用,生产环境禁止使用。
示例:
-- 设置当前 session 使用 Auto DOP 给定的最大并行度为 8
set parallel_degree_limit = 8;
-- 设置全局使用 Auto DOP 给定的最大并行度为 8
set global parallel_degree_limit = 8;
相关文档
- 有关 Auto DOP 的更多信息,参见 Auto DOP。