diff --git a/src/share/system_variable/ob_sys_var_class_type.h b/src/share/system_variable/ob_sys_var_class_type.h index 26f39984b4..5a220c0815 100644 --- a/src/share/system_variable/ob_sys_var_class_type.h +++ b/src/share/system_variable/ob_sys_var_class_type.h @@ -245,6 +245,9 @@ enum ObSysVarClassType SYS_VAR__SET_REVERSE_DBLINK_INFOS = 10139, SYS_VAR__SHOW_DDL_IN_COMPAT_MODE = 10140, SYS_VAR__FORCE_ORDER_PRESERVE_SET = 10141, + SYS_VAR_PARALLEL_DEGREE_POLICY = 10142, + SYS_VAR_PARALLEL_DEGREE_LIMIT = 10143, + SYS_VAR_PARALLEL_MIN_SCAN_TIME_THRESHOLD = 10144, }; } diff --git a/src/share/system_variable/ob_system_variable_alias.h b/src/share/system_variable/ob_system_variable_alias.h index 46fff486ab..82620888de 100644 --- a/src/share/system_variable/ob_system_variable_alias.h +++ b/src/share/system_variable/ob_system_variable_alias.h @@ -240,6 +240,9 @@ namespace share static const char* const OB_SV__SET_REVERSE_DBLINK_INFOS = "_set_reverse_dblink_infos"; static const char* const OB_SV__SHOW_DDL_IN_COMPAT_MODE = "_show_ddl_in_compat_mode"; static const char* const OB_SV__FORCE_ORDER_PRESERVE_SET = "_force_order_preserve_set"; + static const char* const OB_SV_PARALLEL_DEGREE_POLICY = "parallel_degree_policy"; + static const char* const OB_SV_PARALLEL_DEGREE_LIMIT = "parallel_degree_limit"; + static const char* const OB_SV_PARALLEL_MIN_SCAN_TIME_THRESHOLD = "parallel_min_scan_time_threshold"; } } diff --git a/src/share/system_variable/ob_system_variable_factory.cpp b/src/share/system_variable/ob_system_variable_factory.cpp index 2a218dd380..97ae3526dd 100644 --- a/src/share/system_variable/ob_system_variable_factory.cpp +++ b/src/share/system_variable/ob_system_variable_factory.cpp @@ -116,6 +116,11 @@ const char *ObSysVarPxDistAggPartialRollupPushdown::_PX_DIST_AGG_PARTIAL_ROLLUP_ "ADAPTIVE", 0 }; +const char *ObSysVarParallelDegreePolicy::PARALLEL_DEGREE_POLICY_NAMES[] = { + "MANUAL", + "AUTO", + 0 +}; const char *ObSysVarFactory::SYS_VAR_NAMES_SORTED_BY_NAME[] = { "_aggregation_optimization_settings", @@ -274,6 +279,9 @@ const char *ObSysVarFactory::SYS_VAR_NAMES_SORTED_BY_NAME[] = { "ob_trx_timeout", "optimizer_capture_sql_plan_baselines", "optimizer_use_sql_plan_baselines", + "parallel_degree_limit", + "parallel_degree_policy", + "parallel_min_scan_time_threshold", "parallel_servers_target", "performance_schema", "plsql_ccflags", @@ -501,6 +509,9 @@ const ObSysVarClassType ObSysVarFactory::SYS_VAR_IDS_SORTED_BY_NAME[] = { SYS_VAR_OB_TRX_TIMEOUT, SYS_VAR_OPTIMIZER_CAPTURE_SQL_PLAN_BASELINES, SYS_VAR_OPTIMIZER_USE_SQL_PLAN_BASELINES, + SYS_VAR_PARALLEL_DEGREE_LIMIT, + SYS_VAR_PARALLEL_DEGREE_POLICY, + SYS_VAR_PARALLEL_MIN_SCAN_TIME_THRESHOLD, SYS_VAR_PARALLEL_SERVERS_TARGET, SYS_VAR_PERFORMANCE_SCHEMA, SYS_VAR_PLSQL_CCFLAGS, @@ -795,7 +806,10 @@ const char *ObSysVarFactory::SYS_VAR_NAMES_SORTED_BY_ID[] = { "_optimizer_gather_stats_on_load", "_set_reverse_dblink_infos", "_show_ddl_in_compat_mode", - "_force_order_preserve_set" + "_force_order_preserve_set", + "parallel_degree_policy", + "parallel_degree_limit", + "parallel_min_scan_time_threshold" }; bool ObSysVarFactory::sys_var_name_case_cmp(const char *name1, const ObString &name2) @@ -1187,6 +1201,9 @@ int ObSysVarFactory::create_all_sys_vars() + sizeof(ObSysVarSetReverseDblinkInfos) + sizeof(ObSysVarShowDdlInCompatMode) + sizeof(ObSysVarForceOrderPreserveSet) + + sizeof(ObSysVarParallelDegreePolicy) + + sizeof(ObSysVarParallelDegreeLimit) + + sizeof(ObSysVarParallelMinScanTimeThreshold) ; void *ptr = NULL; if (OB_ISNULL(ptr = allocator_.alloc(total_mem_size))) { @@ -3211,6 +3228,33 @@ int ObSysVarFactory::create_all_sys_vars() ptr = (void *)((char *)ptr + sizeof(ObSysVarForceOrderPreserveSet)); } } + if (OB_SUCC(ret)) { + if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarParallelDegreePolicy())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarParallelDegreePolicy", K(ret)); + } else { + store_buf_[ObSysVarsToIdxMap::get_store_idx(static_cast(SYS_VAR_PARALLEL_DEGREE_POLICY))] = sys_var_ptr; + ptr = (void *)((char *)ptr + sizeof(ObSysVarParallelDegreePolicy)); + } + } + if (OB_SUCC(ret)) { + if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarParallelDegreeLimit())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarParallelDegreeLimit", K(ret)); + } else { + store_buf_[ObSysVarsToIdxMap::get_store_idx(static_cast(SYS_VAR_PARALLEL_DEGREE_LIMIT))] = sys_var_ptr; + ptr = (void *)((char *)ptr + sizeof(ObSysVarParallelDegreeLimit)); + } + } + if (OB_SUCC(ret)) { + if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarParallelMinScanTimeThreshold())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarParallelMinScanTimeThreshold", K(ret)); + } else { + store_buf_[ObSysVarsToIdxMap::get_store_idx(static_cast(SYS_VAR_PARALLEL_MIN_SCAN_TIME_THRESHOLD))] = sys_var_ptr; + ptr = (void *)((char *)ptr + sizeof(ObSysVarParallelMinScanTimeThreshold)); + } + } } return ret; @@ -5701,6 +5745,39 @@ int ObSysVarFactory::create_sys_var(ObSysVarClassType sys_var_id, ObBasicSysVar } break; } + case SYS_VAR_PARALLEL_DEGREE_POLICY: { + void *ptr = NULL; + if (OB_ISNULL(ptr = allocator_.alloc(sizeof(ObSysVarParallelDegreePolicy)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to alloc memory", K(ret), K(sizeof(ObSysVarParallelDegreePolicy))); + } else if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarParallelDegreePolicy())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarParallelDegreePolicy", K(ret)); + } + break; + } + case SYS_VAR_PARALLEL_DEGREE_LIMIT: { + void *ptr = NULL; + if (OB_ISNULL(ptr = allocator_.alloc(sizeof(ObSysVarParallelDegreeLimit)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to alloc memory", K(ret), K(sizeof(ObSysVarParallelDegreeLimit))); + } else if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarParallelDegreeLimit())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarParallelDegreeLimit", K(ret)); + } + break; + } + case SYS_VAR_PARALLEL_MIN_SCAN_TIME_THRESHOLD: { + void *ptr = NULL; + if (OB_ISNULL(ptr = allocator_.alloc(sizeof(ObSysVarParallelMinScanTimeThreshold)))) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to alloc memory", K(ret), K(sizeof(ObSysVarParallelMinScanTimeThreshold))); + } else if (OB_ISNULL(sys_var_ptr = new (ptr)ObSysVarParallelMinScanTimeThreshold())) { + ret = OB_ALLOCATE_MEMORY_FAILED; + LOG_ERROR("fail to new ObSysVarParallelMinScanTimeThreshold", K(ret)); + } + break; + } default: { ret = OB_ERR_UNEXPECTED; diff --git a/src/share/system_variable/ob_system_variable_factory.h b/src/share/system_variable/ob_system_variable_factory.h index 6e6ee79ac3..aa6112d163 100644 --- a/src/share/system_variable/ob_system_variable_factory.h +++ b/src/share/system_variable/ob_system_variable_factory.h @@ -1619,6 +1619,29 @@ public: inline virtual ObSysVarClassType get_type() const { return SYS_VAR__FORCE_ORDER_PRESERVE_SET; } inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(223); } }; +class ObSysVarParallelDegreePolicy : public ObEnumSysVar +{ +public: + const static char * PARALLEL_DEGREE_POLICY_NAMES[]; +public: + ObSysVarParallelDegreePolicy() : ObEnumSysVar(PARALLEL_DEGREE_POLICY_NAMES, NULL, NULL, NULL, NULL, NULL) {} + inline virtual ObSysVarClassType get_type() const { return SYS_VAR_PARALLEL_DEGREE_POLICY; } + inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(224); } +}; +class ObSysVarParallelDegreeLimit : public ObIntSysVar +{ +public: + ObSysVarParallelDegreeLimit() : ObIntSysVar(NULL, NULL, NULL, NULL, NULL) {} + inline virtual ObSysVarClassType get_type() const { return SYS_VAR_PARALLEL_DEGREE_LIMIT; } + inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(225); } +}; +class ObSysVarParallelMinScanTimeThreshold : public ObIntSysVar +{ +public: + ObSysVarParallelMinScanTimeThreshold() : ObIntSysVar(NULL, NULL, NULL, NULL, NULL) {} + inline virtual ObSysVarClassType get_type() const { return SYS_VAR_PARALLEL_MIN_SCAN_TIME_THRESHOLD; } + inline virtual const common::ObObj &get_global_default_value() const { return ObSysVariables::get_default_value(226); } +}; class ObSysVarFactory @@ -1638,7 +1661,7 @@ public: static const common::ObString get_sys_var_name_by_id(ObSysVarClassType sys_var_id); const static int64_t MYSQL_SYS_VARS_COUNT = 97; - const static int64_t OB_SYS_VARS_COUNT = 127; + const static int64_t OB_SYS_VARS_COUNT = 130; const static int64_t ALL_SYS_VARS_COUNT = MYSQL_SYS_VARS_COUNT + OB_SYS_VARS_COUNT; const static int16_t OB_SPECIFIC_SYS_VAR_ID_OFFSET = 10000; diff --git a/src/share/system_variable/ob_system_variable_init.cpp b/src/share/system_variable/ob_system_variable_init.cpp index c73d72a411..96e923f77b 100644 --- a/src/share/system_variable/ob_system_variable_init.cpp +++ b/src/share/system_variable/ob_system_variable_init.cpp @@ -2939,13 +2939,54 @@ static struct VarsInit{ ObSysVars[223].alias_ = "OB_SV__FORCE_ORDER_PRESERVE_SET" ; }(); + [&] (){ + ObSysVars[224].info_ = "specifies whether automatic degree of parallelism will be enabled" ; + ObSysVars[224].name_ = "parallel_degree_policy" ; + ObSysVars[224].data_type_ = ObIntType ; + ObSysVars[224].enum_names_ = "[u'MANUAL', u'AUTO']" ; + ObSysVars[224].value_ = "0" ; + ObSysVars[224].flags_ = ObSysVarFlag::GLOBAL_SCOPE | ObSysVarFlag::SESSION_SCOPE | ObSysVarFlag::INFLUENCE_PLAN ; + ObSysVars[224].id_ = SYS_VAR_PARALLEL_DEGREE_POLICY ; + cur_max_var_id = MAX(cur_max_var_id, static_cast(SYS_VAR_PARALLEL_DEGREE_POLICY)) ; + ObSysVarsIdToArrayIdx[SYS_VAR_PARALLEL_DEGREE_POLICY] = 224 ; + ObSysVars[224].alias_ = "OB_SV_PARALLEL_DEGREE_POLICY" ; + }(); + + [&] (){ + ObSysVars[225].info_ = "limits the degree of parallelism used by the optimizer when automatic degree of parallelism is enabled" ; + ObSysVars[225].name_ = "parallel_degree_limit" ; + ObSysVars[225].data_type_ = ObUInt64Type ; + ObSysVars[225].value_ = "0" ; + ObSysVars[225].min_val_ = "0" ; + ObSysVars[225].max_val_ = "9223372036854775807" ; + ObSysVars[225].flags_ = ObSysVarFlag::GLOBAL_SCOPE | ObSysVarFlag::SESSION_SCOPE | ObSysVarFlag::INFLUENCE_PLAN ; + ObSysVars[225].id_ = SYS_VAR_PARALLEL_DEGREE_LIMIT ; + cur_max_var_id = MAX(cur_max_var_id, static_cast(SYS_VAR_PARALLEL_DEGREE_LIMIT)) ; + ObSysVarsIdToArrayIdx[SYS_VAR_PARALLEL_DEGREE_LIMIT] = 225 ; + ObSysVars[225].alias_ = "OB_SV_PARALLEL_DEGREE_LIMIT" ; + }(); + + [&] (){ + ObSysVars[226].info_ = "specifies the minimum execution time a table scan should have before it's considered for automatic degree of parallelism, variable unit is milliseconds" ; + ObSysVars[226].name_ = "parallel_min_scan_time_threshold" ; + ObSysVars[226].data_type_ = ObUInt64Type ; + ObSysVars[226].value_ = "1000" ; + ObSysVars[226].min_val_ = "10" ; + ObSysVars[226].max_val_ = "9223372036854775807" ; + ObSysVars[226].flags_ = ObSysVarFlag::GLOBAL_SCOPE | ObSysVarFlag::SESSION_SCOPE | ObSysVarFlag::INFLUENCE_PLAN ; + ObSysVars[226].id_ = SYS_VAR_PARALLEL_MIN_SCAN_TIME_THRESHOLD ; + cur_max_var_id = MAX(cur_max_var_id, static_cast(SYS_VAR_PARALLEL_MIN_SCAN_TIME_THRESHOLD)) ; + ObSysVarsIdToArrayIdx[SYS_VAR_PARALLEL_MIN_SCAN_TIME_THRESHOLD] = 226 ; + ObSysVars[226].alias_ = "OB_SV_PARALLEL_MIN_SCAN_TIME_THRESHOLD" ; + }(); + if (cur_max_var_id >= ObSysVarFactory::OB_MAX_SYS_VAR_ID) { HasInvalidSysVar = true; } } }vars_init; -static int64_t var_amount = 224; +static int64_t var_amount = 227; int64_t ObSysVariables::get_all_sys_var_count(){ return ObSysVarFactory::ALL_SYS_VARS_COUNT;} ObSysVarClassType ObSysVariables::get_sys_var_id(int64_t i){ return ObSysVars[i].id_;} diff --git a/src/share/system_variable/ob_system_variable_init.json b/src/share/system_variable/ob_system_variable_init.json index 195db13e7c..1ff1b25c58 100644 --- a/src/share/system_variable/ob_system_variable_init.json +++ b/src/share/system_variable/ob_system_variable_init.json @@ -2968,5 +2968,49 @@ "info_cn": "用于控制set query的改写行为和计划生成逻辑,保证分支串行执行和结果集顺序", "background_cn": "", "ref_url": "" + }, + "parallel_degree_policy": { + "id": 10142, + "name": "parallel_degree_policy", + "value": "0", + "data_type": "enum", + "enum_names": [ + "MANUAL", + "AUTO" + ], + "info": "specifies whether automatic degree of parallelism will be enabled", + "flags": "GLOBAL | SESSION | INFLUENCE_PLAN", + "publish_version": "420", + "info_cn": "控制并行度选择策略", + "background_cn": "", + "ref_url": "" + }, + "parallel_degree_limit": { + "id": 10143, + "name": "parallel_degree_limit", + "value": "0", + "data_type": "uint", + "info": "limits the degree of parallelism used by the optimizer when automatic degree of parallelism is enabled", + "flags": "GLOBAL | SESSION | INFLUENCE_PLAN", + "min_val": "0", + "max_val": "9223372036854775807", + "publish_version": "420", + "info_cn": "使用 Auto DOP 策略时, 限制优化器选择并行度上限值", + "background_cn": "", + "ref_url": "" + }, + "parallel_min_scan_time_threshold": { + "id": 10144, + "name": "parallel_min_scan_time_threshold", + "value": "1000", + "data_type": "uint", + "info": "specifies the minimum execution time a table scan should have before it's considered for automatic degree of parallelism, variable unit is milliseconds", + "flags": "GLOBAL | SESSION | INFLUENCE_PLAN", + "min_val": "10", + "max_val": "9223372036854775807", + "publish_version": "420", + "info_cn": "使用 Auto DOP 策略时, 增大基表扫描并行度参考执行时间, 单位 ms", + "background_cn": "", + "ref_url": "" } }