diff --git a/src/share/parameter/ob_parameter_seed.ipp b/src/share/parameter/ob_parameter_seed.ipp index 89e3db73dc..4453a8b202 100755 --- a/src/share/parameter/ob_parameter_seed.ipp +++ b/src/share/parameter/ob_parameter_seed.ipp @@ -335,6 +335,16 @@ DEF_BOOL(_ob_enable_dynamic_worker, OB_TENANT_PARAMETER, "True", DEF_INT(_optimizer_ads_time_limit, OB_TENANT_PARAMETER, "10", "[0, 300]", "the maximum optimizer dynamic sampling time limit. Range: [0, 300]", ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); +DEF_BOOL(_hash_join_enabled, OB_TENANT_PARAMETER, "True", + "enable/disable hash join", + ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); +DEF_BOOL(_optimizer_sortmerge_join_enabled, OB_TENANT_PARAMETER, "True", + "enable/disable merge join", + ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); +// +DEF_BOOL(_nested_loop_join_enabled, OB_TENANT_PARAMETER, "True", + "enable/disable nested loop join", + ObParameterAttr(Section::TENANT, Source::DEFAULT, EditLevel::DYNAMIC_EFFECTIVE)); // tenant memtable consumption related DEF_INT(memstore_limit_percentage, OB_CLUSTER_PARAMETER, "50", "(0, 100)", diff --git a/src/sql/ob_optimizer_trace_impl.cpp b/src/sql/ob_optimizer_trace_impl.cpp index d3c955a89f..21ce205bd1 100644 --- a/src/sql/ob_optimizer_trace_impl.cpp +++ b/src/sql/ob_optimizer_trace_impl.cpp @@ -786,6 +786,9 @@ int ObOptimizerTraceImpl::trace_parameters() //for tenant parameters TRACE_PARAMETER(_rowsets_enabled, bool); TRACE_PARAMETER(_enable_px_batch_rescan, bool); + TRACE_PARAMETER(_hash_join_enabled, bool); + TRACE_PARAMETER(_optimizer_sortmerge_join_enabled, bool); + TRACE_PARAMETER(_nested_loop_join_enabled, bool); //for system variables TRACE_SYS_VAR(_PX_SHARED_HASH_JOIN, int64_t); TRACE_SYS_VAR(_ENABLE_PARALLEL_DML, int64_t); diff --git a/src/sql/optimizer/ob_join_order.cpp b/src/sql/optimizer/ob_join_order.cpp index dd41548d4f..a98ef9a2e7 100644 --- a/src/sql/optimizer/ob_join_order.cpp +++ b/src/sql/optimizer/ob_join_order.cpp @@ -10726,6 +10726,20 @@ int ObJoinOrder::get_valid_path_info_from_hint(const ObRelIds &table_set, path_info.local_methods_ &= log_join_hint->local_methods_; } else if (OB_FAIL(log_hint.check_status())) { // spm outline mode, must get local_methods_ from hint LOG_WARN("failed to get valid local methods from hint", K(ret)); + } else { + ObOptimizerContext &opt_ctx = get_plan()->get_optimizer_context(); + int64_t local_methods_mask = 0; + if (opt_ctx.is_hash_join_enabled()) { + local_methods_mask |= HASH_JOIN; + } + if (opt_ctx.is_merge_join_enabled()){ + local_methods_mask |= MERGE_JOIN; + } + if (opt_ctx.is_nested_join_enabled()) { + local_methods_mask |= NESTED_LOOP_JOIN; + } + path_info.local_methods_ &= local_methods_mask; + path_info.prune_mj_ = path_info.local_methods_ != MERGE_JOIN; } } return ret; diff --git a/src/sql/optimizer/ob_optimizer.cpp b/src/sql/optimizer/ob_optimizer.cpp index 89efbbfbbc..86fdce2016 100644 --- a/src/sql/optimizer/ob_optimizer.cpp +++ b/src/sql/optimizer/ob_optimizer.cpp @@ -695,6 +695,18 @@ int ObOptimizer::extract_opt_ctx_basic_flags(const ObDMLStmt &stmt, ObSQLSession ctx_.set_has_dblink(has_dblink); ctx_.set_cost_model_type(rowsets_enabled ? ObOptEstCost::VECTOR_MODEL : ObOptEstCost::NORMAL_MODEL); ctx_.set_has_cursor_expression(has_cursor_expr); + if (!tenant_config.is_valid() || + (!tenant_config->_hash_join_enabled && + !tenant_config->_optimizer_sortmerge_join_enabled && + !tenant_config->_nested_loop_join_enabled)) { + ctx_.set_hash_join_enabled(true); + ctx_.set_merge_join_enabled(true); + ctx_.set_nested_join_enabled(true); + } else { + ctx_.set_hash_join_enabled(tenant_config->_hash_join_enabled); + ctx_.set_merge_join_enabled(tenant_config->_optimizer_sortmerge_join_enabled); + ctx_.set_nested_join_enabled(tenant_config->_nested_loop_join_enabled); + } } return ret; } diff --git a/src/sql/optimizer/ob_optimizer_context.h b/src/sql/optimizer/ob_optimizer_context.h index ac3b93eb31..491e04cbbb 100644 --- a/src/sql/optimizer/ob_optimizer_context.h +++ b/src/sql/optimizer/ob_optimizer_context.h @@ -158,7 +158,10 @@ ObOptimizerContext(ObSQLSessionInfo *session_info, has_var_assign_(false), is_var_assign_only_in_root_stmt_(false), failed_ds_tab_list_(), - has_multiple_link_stmt_(false) + has_multiple_link_stmt_(false), + hash_join_enabled_(true), + optimizer_sortmerge_join_enabled_(true), + nested_loop_join_enabled_(true) { } inline common::ObOptStatManager *get_opt_stat_manager() { return opt_stat_manager_; } inline void set_opt_stat_manager(common::ObOptStatManager *sm) { opt_stat_manager_ = sm; } @@ -518,6 +521,12 @@ ObOptimizerContext(ObSQLSessionInfo *session_info, common::ObIArray &get_failed_ds_tab_list() { return failed_ds_tab_list_; } inline bool has_multiple_link_stmt() const { return has_multiple_link_stmt_; } inline void set_has_multiple_link_stmt(bool v) { has_multiple_link_stmt_ = v; } + inline bool is_hash_join_enabled() const { return hash_join_enabled_; } + inline void set_hash_join_enabled(bool enabled) { hash_join_enabled_ = enabled; } + inline bool is_merge_join_enabled() const { return optimizer_sortmerge_join_enabled_; } + inline void set_merge_join_enabled(bool enabled) { optimizer_sortmerge_join_enabled_ = enabled; } + inline bool is_nested_join_enabled() const { return nested_loop_join_enabled_; } + inline void set_nested_join_enabled(bool enabled) { nested_loop_join_enabled_ = enabled; } private: ObSQLSessionInfo *session_info_; ObExecContext *exec_ctx_; @@ -598,6 +607,9 @@ private: //record the dynamic sampling falied table list, avoid repeated dynamic sampling. common::ObSEArray failed_ds_tab_list_; bool has_multiple_link_stmt_; + bool hash_join_enabled_; + bool optimizer_sortmerge_join_enabled_; + bool nested_loop_join_enabled_; }; } } diff --git a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result index 410cd50b59..45efba03db 100644 --- a/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result +++ b/tools/deploy/mysql_test/test_suite/inner_table/r/mysql/all_virtual_sys_parameter_stat.result @@ -288,6 +288,7 @@ _force_hash_groupby_dump _force_hash_join_spill _force_skip_encoding_partition_id _hash_area_size +_hash_join_enabled _ha_rpc_timeout _ha_tablet_info_batch_count _hidden_sys_tenant_memory @@ -308,6 +309,7 @@ _migrate_block_verify_level _minor_compaction_amplification_factor _min_malloc_sample_interval _mvcc_gc_using_min_txn_snapshot +_nested_loop_join_enabled _ob_ddl_timeout _ob_elr_fast_freeze_threshold _ob_enable_direct_load @@ -326,6 +328,7 @@ _ob_trans_rpc_timeout _optimizer_ads_time_limit _optimizer_better_inlist_costing _optimizer_group_by_placement +_optimizer_sortmerge_join_enabled _parallel_max_active_sessions _parallel_min_message_pool _parallel_server_sleep_time