diff --git a/src/observer/omt/ob_tenant_config.cpp b/src/observer/omt/ob_tenant_config.cpp index ea7629d68f..8d054fd537 100644 --- a/src/observer/omt/ob_tenant_config.cpp +++ b/src/observer/omt/ob_tenant_config.cpp @@ -24,6 +24,7 @@ #include "observer/omt/ob_tenant_config_mgr.h" #include "sql/monitor/flt/ob_flt_control_info_mgr.h" #include "share/errsim_module/ob_errsim_module_interface_imp.h" +#include "src/sql/ob_optimizer_trace_impl.h" using namespace oceanbase::common; @@ -69,6 +70,17 @@ void ObTenantConfig::print() const OB_LOG(INFO, "===================== * stop tenant config report * =======================", K(tenant_id_)); } +void ObTenantConfig::trace_all_config() const +{ + ObConfigContainer::const_iterator it = container_.begin(); + for (; it != container_.end(); ++it) { + if (OB_ISNULL(it->second)) { + } else if (it->second->case_compare(it->second->default_str()) != 0) { + OPT_TRACE(" ", it->first.str(), " = ", it->second->str()); + } + } +} + int ObTenantConfig::read_config() { int ret = OB_SUCCESS; diff --git a/src/observer/omt/ob_tenant_config.h b/src/observer/omt/ob_tenant_config.h index 3a8402191c..4ac5d2df42 100644 --- a/src/observer/omt/ob_tenant_config.h +++ b/src/observer/omt/ob_tenant_config.h @@ -73,6 +73,7 @@ public: ObTenantConfig &operator=(const ObTenantConfig &)=delete; void print() const override; + void trace_all_config() const; int check_all() const override { return OB_SUCCESS; } common::ObServerRole get_server_type() const override { return common::OB_SERVER; } void ref() { ATOMIC_INC(&ref_); } diff --git a/src/observer/omt/ob_tenant_config_mgr.cpp b/src/observer/omt/ob_tenant_config_mgr.cpp index d1a3c0d028..ffb7c79369 100644 --- a/src/observer/omt/ob_tenant_config_mgr.cpp +++ b/src/observer/omt/ob_tenant_config_mgr.cpp @@ -53,6 +53,13 @@ void ObTenantConfigGuard::set_config(ObTenantConfig *config) config_ = config; } +void ObTenantConfigGuard::trace_all_config() const +{ + if (OB_NOT_NULL(config_)) { + config_->trace_all_config(); + } +} + int TenantConfigInfo::assign(const TenantConfigInfo &rhs) { int ret = OB_SUCCESS; diff --git a/src/observer/omt/ob_tenant_config_mgr.h b/src/observer/omt/ob_tenant_config_mgr.h index 4814f184ee..002f8c4c6f 100644 --- a/src/observer/omt/ob_tenant_config_mgr.h +++ b/src/observer/omt/ob_tenant_config_mgr.h @@ -48,6 +48,7 @@ public: * Requires: check is_valid(). */ ObTenantConfig *operator->() { return config_; } + void trace_all_config() const; private: ObTenantConfig *config_; }; diff --git a/src/sql/monitor/ob_sql_plan.cpp b/src/sql/monitor/ob_sql_plan.cpp index 3aa65fe8aa..61aa5a776b 100644 --- a/src/sql/monitor/ob_sql_plan.cpp +++ b/src/sql/monitor/ob_sql_plan.cpp @@ -2553,10 +2553,18 @@ const char* ObSqlPlan::get_tree_line(int type) int ret = OB_SUCCESS; ObCharsetType client_character = ObCharsetType::CHARSET_INVALID; ObCharsetType connection_character = ObCharsetType::CHARSET_INVALID; + ObCharsetType db_character = ObCharsetType::CHARSET_INVALID; + ObCollationType coll_type; if (NULL == session_ || OB_FAIL(session_->get_character_set_client(client_character)) || - OB_FAIL(session_->get_character_set_connection(connection_character))) { + OB_FAIL(session_->get_character_set_connection(connection_character)) || + OB_FAIL(session_->get_character_set_results(db_character))) { return tree_line[type%3]; + } else if (OB_FALSE_IT(coll_type=session_->get_nls_collation())) { + } else if (OB_FALSE_IT(db_character=ObCharset::charset_type_by_coll(coll_type))) { + } else if (!(ObCharsetType::CHARSET_BINARY == db_character || + ObCharsetType::CHARSET_UTF8MB4 == db_character)) { + return tree_line[3+type%3]; } else if ((ObCharsetType::CHARSET_BINARY == client_character || ObCharsetType::CHARSET_UTF8MB4 == client_character) && (ObCharsetType::CHARSET_BINARY == connection_character || diff --git a/src/sql/ob_optimizer_trace_impl.cpp b/src/sql/ob_optimizer_trace_impl.cpp index 29100e49f7..306294d129 100644 --- a/src/sql/ob_optimizer_trace_impl.cpp +++ b/src/sql/ob_optimizer_trace_impl.cpp @@ -181,7 +181,8 @@ ObOptimizerTraceImpl::ObOptimizerTraceImpl() section_(0), trace_level_(0), enable_(false), - trace_state_before_stop_(false) + trace_state_(1), + enable_trace_cost_model_(false) { } @@ -199,6 +200,12 @@ int ObOptimizerTraceImpl::enable_trace(const common::ObString &identifier, if (OB_FAIL(set_parameters(identifier, sql_id, trace_level))) { LOG_WARN("failed to set parameters", K(ret)); } else { + start_time_us_ = 0; + last_time_us_ = 0; + last_mem_ = 0; + section_ = 0; + trace_state_ = 1; + enable_trace_cost_model_ = false; set_enable(true); } return ret; @@ -224,15 +231,16 @@ void ObOptimizerTraceImpl::reset() log_handle_.close(); sql_id_.reset(); enable_ = false; - trace_state_before_stop_ = false; + trace_state_ = 1; + enable_trace_cost_model_ = false; } bool ObOptimizerTraceImpl::enable(const common::ObString &sql_id) { if (!sql_id_.empty()) { - return enable_ && (sql_id_.compare(sql_id) == 0); + return enable() && (sql_id_.compare(sql_id) == 0); } else { - return enable_; + return enable(); } } @@ -241,6 +249,7 @@ int ObOptimizerTraceImpl::open() int ret = OB_SUCCESS; start_time_us_ = ObTimeUtil::current_time(); last_time_us_ = start_time_us_; + last_mem_ = 0; if (OB_FAIL(log_handle_.open())) { LOG_WARN("fail to open file", K(ret)); } @@ -254,13 +263,18 @@ void ObOptimizerTraceImpl::close() void ObOptimizerTraceImpl::resume_trace() { - set_enable(trace_state_before_stop_); + trace_state_ >>= 1; } void ObOptimizerTraceImpl::stop_trace() { - trace_state_before_stop_ = enable_; - set_enable(false); + trace_state_ <<= 1; +} + +void ObOptimizerTraceImpl::restart_trace() +{ + trace_state_ <<= 1; + trace_state_ |= 1; } int ObOptimizerTraceImpl::new_line() @@ -641,12 +655,16 @@ int ObOptimizerTraceImpl::append(const JoinPath* join_path) ",right need sort:", join_path->right_need_sort_, ",right prefix pos:", join_path->right_prefix_pos_); } new_line(); + append(join_path->get_sharding()); + new_line(); append("left path:"); if (OB_NOT_NULL(join_path->left_path_) && OB_NOT_NULL(join_path->left_path_->parent_)) { increase_section(); new_line(); append("tables:", join_path->left_path_->parent_); new_line(); + append_ptr(join_path->left_path_); + new_line(); append("cost:", join_path->left_path_->cost_, ",card:", join_path->left_path_->parent_->get_output_rows(), ",width:", join_path->left_path_->parent_->get_output_row_size()); new_line(); @@ -663,6 +681,8 @@ int ObOptimizerTraceImpl::append(const JoinPath* join_path) new_line(); append("tables:", join_path->right_path_->parent_); new_line(); + new_line(); + append_ptr(join_path->right_path_); append("cost:", join_path->right_path_->cost_, ",card:", join_path->right_path_->parent_->get_output_rows(), ",width:", join_path->right_path_->parent_->get_output_row_size()); new_line(); @@ -802,6 +822,8 @@ int ObOptimizerTraceImpl::append(const ObDSResultItem &ds_result) } else if (OB_FAIL(append("ds_degree:", stat->get_ds_degree()))) { LOG_WARN("failed to append msg", K(ret)); + } else if (OB_FAIL(new_line())) { + LOG_WARN("failed to append msg", K(ret)); } else { for (int64_t j = 0; OB_SUCC(ret) && j < stat->get_ds_col_stats().count(); ++j) { const ObOptDSColStat &col_stat = stat->get_ds_col_stats().at(j); @@ -885,74 +907,16 @@ int ObOptimizerTraceImpl::trace_parameters() { int ret = OB_SUCCESS; if (OB_NOT_NULL(session_info_)) { - /*+ - var: name from ob_system_variable_init.json - should be upper case - type: ObObj、ObString、int64_t、uint64_t - */ - #define TRACE_SYS_VAR(var, type) \ - do { \ - type value; \ - if (OB_FAIL(ret)) { \ - } else if (OB_FAIL(new_line())) { \ - LOG_WARN("failed to append msg", K(ret)); \ - } else if (OB_FAIL(session->get_sys_variable(share::SYS_VAR_##var, value))) { \ - LOG_WARN("failed to get parameter value", K(ret)); \ - } else if (OB_FAIL(append_lower(#var))) { \ - LOG_WARN("failed to append msg", K(ret)); \ - } else if (OB_FAIL(append(":\t", value))) { \ - LOG_WARN("failed to append msg", K(ret)); \ - } \ - } while (0); - - /*+ - var: name from ob_parameter_seed.ipp - should be lower case - type: bool、int64_t、uint64_t - */ - #define TRACE_PARAMETER(var, type) \ - do{ \ - type v; \ - omt::ObTenantConfigGuard tenant_config(TENANT_CONF(session->get_effective_tenant_id())); \ - if (OB_UNLIKELY(!tenant_config.is_valid())) { \ - v = 0; \ - } else if (tenant_config->var) { \ - v = 1; \ - } else { \ - v = 0; \ - } \ - if (OB_FAIL(new_line())) { \ - LOG_WARN("failed to append msg", K(ret)); \ - } else if (OB_FAIL(append_key_value(#var, v))) { \ - LOG_WARN("failed to append msg", K(ret)); \ - } \ - } while (0); - - ObSQLSessionInfo *session = session_info_; - //for tenant parameters - TRACE_PARAMETER(_rowsets_enabled, bool); - TRACE_PARAMETER(_enable_px_batch_rescan, bool); - TRACE_PARAMETER(_enable_spf_batch_rescan, bool); - TRACE_PARAMETER(_hash_join_enabled, bool); - TRACE_PARAMETER(_optimizer_sortmerge_join_enabled, bool); - TRACE_PARAMETER(_nested_loop_join_enabled, bool); - TRACE_PARAMETER(_enable_var_assign_use_das, bool); - TRACE_PARAMETER(_enable_das_keep_order, bool); - //for system variables - TRACE_SYS_VAR(_PX_SHARED_HASH_JOIN, int64_t); - TRACE_SYS_VAR(_ENABLE_PARALLEL_DML, int64_t); - TRACE_SYS_VAR(_NLJ_BATCHING_ENABLED, int64_t); - TRACE_SYS_VAR(_ENABLE_PARALLEL_QUERY, int64_t); - TRACE_SYS_VAR(PARALLEL_SERVERS_TARGET, int64_t); - TRACE_SYS_VAR(_FORCE_PARALLEL_DML_DOP, uint64_t); - TRACE_SYS_VAR(OB_ENABLE_TRANSFORMATION, int64_t); - TRACE_SYS_VAR(_FORCE_PARALLEL_QUERY_DOP, uint64_t); - TRACE_SYS_VAR(_PX_MIN_GRANULES_PER_SLAVE, int64_t); - TRACE_SYS_VAR(_PX_PARTIAL_ROLLUP_PUSHDOWN, int64_t); - TRACE_SYS_VAR(_PX_PARTITION_SCAN_THRESHOLD, int64_t); - TRACE_SYS_VAR(_OB_PX_SLAVE_MAPPING_THRESHOLD, int64_t); - TRACE_SYS_VAR(_OPTIMIZER_NULL_AWARE_ANTIJOIN, int64_t); - TRACE_SYS_VAR(_PX_DIST_AGG_PARTIAL_ROLLUP_PUSHDOWN, int64_t); + int64_t tenant_id = session_info_->get_effective_tenant_id(); + omt::ObTenantConfigGuard tenant_config(TENANT_CONF(tenant_id)); + if (tenant_config.is_valid()) { + new_line(); + append("tenant config:"); + tenant_config.trace_all_config(); + } + new_line(); + append("system variables:"); + session_info_->trace_all_sys_vars(); } return ret; } diff --git a/src/sql/ob_optimizer_trace_impl.h b/src/sql/ob_optimizer_trace_impl.h index 510d81504e..8599392b02 100644 --- a/src/sql/ob_optimizer_trace_impl.h +++ b/src/sql/ob_optimizer_trace_impl.h @@ -45,6 +45,7 @@ class ObSQLSessionInfo; struct CandidatePlan; class OptSystemStat; class ObSkylineDim; +struct ColumnItem; class ObOptimizerTraceImpl; @@ -57,8 +58,8 @@ inline ObOptimizerTraceImpl** get_local_tracer() #define TITLE_LINE "------------------------------------------------------" -#define KV(x) " ", #x, " = ", x -#define KV_(x) " ", #x, " = ", x##_ +#define KV(x) #x, "(", x , ")" +#define KV_(x) #x, "(", x##_, ")" #define BEGIN_OPT_TRACE(session, sql_id) \ ObOptimizerTraceImpl *copy_tracer = NULL; \ @@ -67,7 +68,8 @@ inline ObOptimizerTraceImpl** get_local_tracer() if (OB_ISNULL(local_tracer) || OB_ISNULL(session)) { \ } else { \ copy_tracer = *local_tracer; \ - if (session->get_optimizer_tracer().enable(sql_id)) { \ + if (session->is_user_session() && \ + session->get_optimizer_tracer().enable(sql_id)) { \ session->get_optimizer_tracer().open(); \ } \ *local_tracer = &(session->get_optimizer_tracer()); \ @@ -79,7 +81,8 @@ inline ObOptimizerTraceImpl** get_local_tracer() ObOptimizerTraceImpl** local_tracer = get_local_tracer(); \ if (OB_ISNULL(local_tracer) || OB_ISNULL(session)) { \ } else { \ - if (session->get_optimizer_tracer().enable()) { \ + if (session->is_user_session() && \ + session->get_optimizer_tracer().enable()) { \ session->get_optimizer_tracer().close(); \ } \ *local_tracer = copy_tracer; \ @@ -96,9 +99,12 @@ inline ObOptimizerTraceImpl** get_local_tracer() #define CHECK_TRACE_ENABLED \ CHECK_TRACE if (tracer->enable()) \ +#define CHECK_CAN_TRACE_LOG \ + CHECK_TRACE if (tracer->can_trace_log()) \ + #define RESUME_OPT_TRACE \ do { \ - CHECK_TRACE { \ + CHECK_TRACE_ENABLED { \ tracer->resume_trace(); \ } \ } while (0); \ @@ -110,23 +116,30 @@ inline ObOptimizerTraceImpl** get_local_tracer() } \ } while (0); \ +#define RESTART_OPT_TRACE \ + do { \ + CHECK_TRACE_ENABLED { \ + tracer->restart_trace();\ + } \ + } while (0); \ + #define OPT_TRACE_BEGIN_SECTION \ do { \ - CHECK_TRACE_ENABLED { \ + CHECK_CAN_TRACE_LOG { \ tracer->increase_section(); \ } \ } while (0); \ #define OPT_TRACE_END_SECTION \ do { \ - CHECK_TRACE_ENABLED { \ + CHECK_CAN_TRACE_LOG { \ tracer->decrease_section(); \ } \ } while (0); \ #define OPT_TRACE(args...) \ do { \ - CHECK_TRACE_ENABLED { \ + CHECK_CAN_TRACE_LOG { \ tracer->new_line(); \ SMART_CALL(tracer->append(args)); \ } \ @@ -134,14 +147,38 @@ inline ObOptimizerTraceImpl** get_local_tracer() #define OPT_TRACE_TITLE(args...) \ do { \ - CHECK_TRACE_ENABLED { \ + CHECK_CAN_TRACE_LOG { \ tracer->append_title(args); \ } \ } while (0); \ +#define BEGIN_OPT_TRACE_EVA_COST \ + do { \ + CHECK_TRACE_ENABLED { \ + if (!tracer->enable_trace_eva_cost()) { \ + STOP_OPT_TRACE; \ + } else { \ + OPT_TRACE_BEGIN_SECTION; \ + OPT_TRACE_TITLE("BEGIN EVALUATE COST FOR STMT"); \ + } \ + } \ + } while (0); + +#define END_OPT_TRACE_EVA_COST \ + do { \ + CHECK_TRACE_ENABLED { \ + if (!tracer->enable_trace_eva_cost()) { \ + RESUME_OPT_TRACE; \ + } else { \ + OPT_TRACE_TITLE("END EVALUATE COST FOR STMT"); \ + OPT_TRACE_END_SECTION; \ + } \ + } \ + } while (0); + #define OPT_TRACE_ENV \ do { \ - CHECK_TRACE_ENABLED { \ + CHECK_CAN_TRACE_LOG { \ tracer->append_title("SYSTEM ENVIRONMENT"); \ tracer->trace_env(); \ } \ @@ -149,7 +186,7 @@ inline ObOptimizerTraceImpl** get_local_tracer() #define OPT_TRACE_SESSION_INFO \ do { \ - CHECK_TRACE_ENABLED { \ + CHECK_CAN_TRACE_LOG { \ tracer->append_title("SESSION INFO"); \ tracer->trace_session_info(); \ } \ @@ -157,7 +194,7 @@ inline ObOptimizerTraceImpl** get_local_tracer() #define OPT_TRACE_PARAMETERS \ do { \ - CHECK_TRACE_ENABLED { \ + CHECK_CAN_TRACE_LOG { \ tracer->append_title("OPTIMIZER PARAMETERS");\ tracer->trace_parameters(); \ } \ @@ -165,32 +202,55 @@ inline ObOptimizerTraceImpl** get_local_tracer() #define OPT_TRACE_STATIS(stmt, table_metas) \ do { \ - CHECK_TRACE_ENABLED { \ + CHECK_CAN_TRACE_LOG { \ tracer->trace_static(stmt, table_metas); \ } \ } while (0); \ #define OPT_TRACE_TRANSFORM_SQL(stmt) \ do { \ - CHECK_TRACE_ENABLED { \ + CHECK_CAN_TRACE_LOG { \ tracer->trace_trans_sql(stmt); \ } \ } while (0); \ #define OPT_TRACE_TIME_USED \ do { \ - CHECK_TRACE_ENABLED { \ + CHECK_CAN_TRACE_LOG { \ tracer->trace_time_used(); \ } \ } while (0); \ #define OPT_TRACE_MEM_USED \ do { \ - CHECK_TRACE_ENABLED { \ + CHECK_CAN_TRACE_LOG { \ tracer->trace_mem_used(); \ } \ } while (0); \ +#define ENABLE_OPT_TRACE_COST_MODEL \ + do { \ + CHECK_CAN_TRACE_LOG { \ + tracer->set_enable_trace_cost_model(true); \ + } \ + } while(0); \ + +#define DISABLE_OPT_TRACE_COST_MODEL \ + do { \ + CHECK_CAN_TRACE_LOG { \ + tracer->set_enable_trace_cost_model(false); \ + } \ + } while(0); \ + +#define OPT_TRACE_COST_MODEL(args...) \ + do { \ + CHECK_CAN_TRACE_LOG { \ + if (tracer->enable_trace_cost_model()) { \ + OPT_TRACE(" ", args); \ + } \ + } \ + } while(0); \ + class LogFileAppender { public: LogFileAppender(); @@ -227,15 +287,21 @@ public: void close(); inline bool enable() const { return enable_; } bool enable(const common::ObString &sql_id); + + inline bool can_trace_log() const { return enable() && (trace_state_ & 1); } inline void set_enable(bool value) { enable_ = value; } - inline bool enable_trace_trans_sql() const { return trace_level_ > 1; } inline bool enable_trace_time_used() const { return trace_level_ > 0; } inline bool enable_trace_mem_used() const { return trace_level_ > 0; } + inline bool enable_trace_trans_sql() const { return trace_level_ > 1; } + inline void set_enable_trace_cost_model(bool enable) { enable_trace_cost_model_ = enable; } + inline bool enable_trace_cost_model() const { return trace_level_ > 2 && enable_trace_cost_model_; } + inline bool enable_trace_eva_cost() const { return trace_level_ > 3; } inline void increase_section() { ++section_; } inline void decrease_section() { if (section_ > 0) --section_; } inline void set_session_info(ObSQLSessionInfo* info) { session_info_ = info; } void resume_trace(); void stop_trace(); + void restart_trace(); /***********************************************/ ////print basic type @@ -302,6 +368,11 @@ public: typename std::enable_if, T>::value, int>::type append(const T& value); + //for ObIArray + template + typename std::enable_if, T>::value, int>::type + append(const T& value); + //template for function append template int append(const T1& value1, const T2& value2, const ARGS&... args); @@ -331,7 +402,8 @@ private: int section_; int trace_level_; bool enable_; - bool trace_state_before_stop_; + uint64_t trace_state_; + bool enable_trace_cost_model_; }; //for class ObRawExpr @@ -447,6 +519,19 @@ ObOptimizerTraceImpl::append(const T& value) return ret; } +template +typename std::enable_if, T>::value, int>::type +ObOptimizerTraceImpl::append(const T& value) +{ + int ret = OB_SUCCESS; + for (int i = 0; OB_SUCC(ret) && i < value.count(); ++i) { + if (OB_FAIL(append(value.at(i).column_name_))) { + } else if (i > 0 && OB_FAIL(new_line())) { + } + } + return ret; +} + //template for function append template int ObOptimizerTraceImpl::append(const T1& value1, const T2& value2, const ARGS&... args) diff --git a/src/sql/ob_sql.cpp b/src/sql/ob_sql.cpp index 0ad13faddb..4b8ae44b06 100644 --- a/src/sql/ob_sql.cpp +++ b/src/sql/ob_sql.cpp @@ -3796,6 +3796,8 @@ int ObSql::optimize_stmt( LOG_TRACE("logical plan", KPC(logical_plan)); OPT_TRACE_TIME_USED; OPT_TRACE_MEM_USED; + OPT_TRACE_TITLE("SYSTEM STATS:"); + OPT_TRACE(logical_plan->get_optimizer_context().get_system_stat()); OPT_TRACE(logical_plan); } diff --git a/src/sql/optimizer/ob_access_path_estimation.cpp b/src/sql/optimizer/ob_access_path_estimation.cpp index db57eca4ed..ac5419b039 100644 --- a/src/sql/optimizer/ob_access_path_estimation.cpp +++ b/src/sql/optimizer/ob_access_path_estimation.cpp @@ -1708,7 +1708,7 @@ int ObAccessPathEstimation::process_dynamic_sampling_estimation(ObOptimizerConte ds_result_items, only_ds_basic_stat))) { LOG_WARN("failed to init ds result items", K(ret)); } else { - OPT_TRACE("begin to process table dynamic sampling estimation"); + OPT_TRACE_TITLE("BEGIN DYNAMIC SAMPLE ESTIMATION"); ObArenaAllocator allocator("ObOpTableDS", OB_MALLOC_NORMAL_BLOCK_SIZE, ctx.get_session_info()->get_effective_tenant_id()); ObDynamicSampling dynamic_sampling(ctx, allocator); int64_t start_time = ObTimeUtility::current_time(); @@ -1743,7 +1743,7 @@ int ObAccessPathEstimation::process_dynamic_sampling_estimation(ObOptimizerConte LOG_TRACE("finish dynamic sampling", K(only_ds_basic_stat), K(no_ds_data), K(is_success)); } OPT_TRACE("end to process table dynamic sampling estimation"); - OPT_TRACE_TITLE("DYNAMIC SAMPLE RESULT"); + OPT_TRACE("dynamic sampling estimation result:"); OPT_TRACE(ds_result_items); } return ret; diff --git a/src/sql/optimizer/ob_dynamic_sampling.cpp b/src/sql/optimizer/ob_dynamic_sampling.cpp index 793d48e6d5..a1ed58128c 100644 --- a/src/sql/optimizer/ob_dynamic_sampling.cpp +++ b/src/sql/optimizer/ob_dynamic_sampling.cpp @@ -538,7 +538,8 @@ int ObDynamicSampling::estimte_rowcount(int64_t max_ds_timeout, } LOG_TRACE("go to dynamic sample one time", K(sample_block_ratio_), K(ret), K(raw_sql_str), K(max_ds_timeout), K(start_time), K(ObTimeUtility::current_time() - start_time)); - OPT_TRACE("go to dynamic sample one time", max_ds_timeout, start_time, ObTimeUtility::current_time()); + OPT_TRACE("dynamic sample cost time:", ObTimeUtility::current_time()-start_time, + "us, max sample time:", max_ds_timeout, "us"); return ret; } @@ -622,7 +623,7 @@ int ObDynamicSampling::pack(ObSqlString &raw_sql_str) LOG_WARN("failed to build query sql stmt", K(ret)); } else { LOG_TRACE("OptStat: dynamic sampling query sql", K(raw_sql_str)); - OPT_TRACE("OptStat: dynamic sampling query sql", raw_sql_str.string()); + OPT_TRACE("dynamic sampling query sql:", raw_sql_str.string()); } return ret; } diff --git a/src/sql/optimizer/ob_join_order.cpp b/src/sql/optimizer/ob_join_order.cpp index 7e67550fc1..9eb2ef3fec 100644 --- a/src/sql/optimizer/ob_join_order.cpp +++ b/src/sql/optimizer/ob_join_order.cpp @@ -5808,6 +5808,8 @@ int AccessPath::estimate_cost() adj_cost_is_valid))) { LOG_WARN("failed to check adj index cost valid", K(ret)); } else { + ENABLE_OPT_TRACE_COST_MODEL; + OPT_TRACE_COST_MODEL("calc cost for index:", index_id_); ObOptimizerContext &opt_ctx = parent_->get_plan()->get_optimizer_context(); if (OB_FAIL(ObOptEstCost::cost_table(est_cost_info_, parallel_, @@ -5816,6 +5818,7 @@ int AccessPath::estimate_cost() LOG_WARN("failed to get index access info", K(ret)); } else if (!adj_cost_is_valid) { cost_ = storage_est_cost; + OPT_TRACE_COST_MODEL(KV_(cost), "=", KV(storage_est_cost)); } else if (OB_FALSE_IT(est_cost_info_.phy_query_range_row_count_ = stats_phy_query_range_row_count)) { } else if (OB_FALSE_IT(est_cost_info_.logical_query_range_row_count_ = stats_logical_query_range_row_count)) { } else if (OB_FAIL(ObOptEstCost::cost_table(est_cost_info_, @@ -5826,9 +5829,11 @@ int AccessPath::estimate_cost() } else { double rate = opt_stats_cost_percent * 1.0 / 100.0; cost_ = storage_est_cost * (1-rate) + stats_est_cost * rate; + OPT_TRACE_COST_MODEL(KV_(cost), "=", KV(storage_est_cost), "* (1-", KV(rate), ") +", KV(stats_est_cost), "*", KV(rate)); est_cost_info_.phy_query_range_row_count_ = opt_phy_query_range_row_count; est_cost_info_.logical_query_range_row_count_ = opt_logical_query_range_row_count; } + DISABLE_OPT_TRACE_COST_MODEL; } return ret; } diff --git a/src/sql/optimizer/ob_log_plan.cpp b/src/sql/optimizer/ob_log_plan.cpp index 1fb93e1935..eda2bc30dc 100644 --- a/src/sql/optimizer/ob_log_plan.cpp +++ b/src/sql/optimizer/ob_log_plan.cpp @@ -365,6 +365,7 @@ int ObLogPlan::generate_join_orders() OPT_TRACE("create base path for ", join_rels.at(0).at(i)); OPT_TRACE_BEGIN_SECTION; ret = join_rels.at(0).at(i)->generate_base_paths(); + OPT_TRACE_MEM_USED; OPT_TRACE_END_SECTION; } } @@ -373,8 +374,6 @@ int ObLogPlan::generate_join_orders() //如果有leading hint就在这里按leading hint指定的join order枚举, //如果根据leading hint没有枚举到有效join order,就忽略hint重新枚举。 if (OB_SUCC(ret)) { - OPT_TRACE("SYSTEM STATS:"); - OPT_TRACE(get_optimizer_context().get_system_stat()); OPT_TRACE_TITLE("BASIC TABLE STATISTICS"); OPT_TRACE_STATIS(stmt, get_basic_table_metas()); OPT_TRACE_TITLE("UPDATE TABLE STATISTICS"); diff --git a/src/sql/optimizer/ob_log_table_scan.cpp b/src/sql/optimizer/ob_log_table_scan.cpp index 4d20949fcb..3c9b9fc78a 100644 --- a/src/sql/optimizer/ob_log_table_scan.cpp +++ b/src/sql/optimizer/ob_log_table_scan.cpp @@ -1319,7 +1319,9 @@ int ObLogTableScan::get_plan_item_info(PlanText &plan_text, // print access ObIArray &access = get_access_exprs(); if (OB_FAIL(adjust_print_access_info(access))) { - LOG_WARN("failed to adjust print access info", K(ret)); + ret = OB_SUCCESS; + //ignore error code for explain + EXPLAIN_PRINT_EXPRS(access, type); } else { EXPLAIN_PRINT_EXPRS(access, type); } @@ -2104,6 +2106,7 @@ int ObLogTableScan::set_limit_offset(ObRawExpr *limit, ObRawExpr *offset) param.need_row_count_ = limit_count + offset_count; param.need_row_count_ = std::min(param.need_row_count_, get_card()); } + ENABLE_OPT_TRACE_COST_MODEL; if (OB_FAIL(do_re_est_cost(param, card, op_cost, cost))) { LOG_WARN("failed to re est cost error", K(ret)); } else { @@ -2113,6 +2116,7 @@ int ObLogTableScan::set_limit_offset(ObRawExpr *limit, ObRawExpr *offset) set_card(card); LOG_TRACE("push limit into table scan", K(param), K(limit_count), K(part_count), K(card)); } + DISABLE_OPT_TRACE_COST_MODEL; } return ret; } diff --git a/src/sql/optimizer/ob_opt_est_cost_model.cpp b/src/sql/optimizer/ob_opt_est_cost_model.cpp index 4576d817a4..f5b1107683 100644 --- a/src/sql/optimizer/ob_opt_est_cost_model.cpp +++ b/src/sql/optimizer/ob_opt_est_cost_model.cpp @@ -1311,7 +1311,9 @@ int ObOptEstCostModel::cost_table(const ObCostTableScanInfo &est_cost_info, } else if (OB_NOT_NULL(est_cost_info.table_meta_info_) && EXTERNAL_TABLE == est_cost_info.table_meta_info_->table_type_) { //TODO [ExternalTable] need refine - cost = 4.0 * est_cost_info.phy_query_range_row_count_; + double phy_query_range_row_count = est_cost_info.phy_query_range_row_count_; + cost = 4.0 * phy_query_range_row_count; + OPT_TRACE_COST_MODEL(KV(cost),"=","4.0 * ", KV(phy_query_range_row_count)); } else if (OB_FAIL(cost_basic_table(est_cost_info, part_cnt / parallel, cost))) { @@ -1404,9 +1406,12 @@ int ObOptEstCostModel::cost_basic_table(const ObCostTableScanInfo &est_cost_info LOG_WARN("failed to calc index back cost", K(ret)); } else { cost += index_scan_cost; + OPT_TRACE_COST_MODEL(KV(cost), "+=", KV(index_scan_cost)); cost += index_back_cost; + OPT_TRACE_COST_MODEL(KV(cost), "+=", KV(index_back_cost)); // calc one parallel scan cost cost *= part_cnt_per_dop; + OPT_TRACE_COST_MODEL(KV(cost), "*=", KV(part_cnt_per_dop)); LOG_TRACE("OPT:[ESTIMATE FINISH]", K(cost), K(part_cnt_per_dop), K(est_cost_info)); } } @@ -1493,6 +1498,7 @@ int ObOptEstCostModel::cost_column_store_index_scan(const ObCostTableScanInfo &e LOG_WARN("failed to calc index scan cost", K(ret), K(cg_row_count), K(column_group_est_cost_info)); } else { index_scan_cost += column_group_cost; + OPT_TRACE_COST_MODEL(KV(index_scan_cost), "+=", KV(column_group_cost)); prefix_filter_sel *= cg_info.filter_sel_; LOG_TRACE("OPT:[COST ONE COLUMN GROUP]", K(row_count), K(prefix_filter_sel), K(column_group_cost)); } @@ -1539,6 +1545,7 @@ int ObOptEstCostModel::cost_column_store_index_back(const ObCostTableScanInfo &e LOG_WARN("failed to calc index scan cost", K(ret), K(cg_row_count), K(column_group_est_cost_info)); } else { index_back_cost += column_group_cost; + OPT_TRACE_COST_MODEL(KV(index_back_cost), "+=", KV(column_group_cost)); prefix_filter_sel *= cg_info.filter_sel_; LOG_TRACE("OPT:[COST ONE COLUMN GROUP]", K(row_count), K(prefix_filter_sel), K(column_group_cost)); } @@ -1551,6 +1558,7 @@ int ObOptEstCostModel::cost_column_store_index_back(const ObCostTableScanInfo &e LOG_WARN("failed to get newwork transform cost for global index", K(ret)); } else { index_back_cost += network_cost; + OPT_TRACE_COST_MODEL(KV(index_back_cost), "+=", KV(network_cost)); } LOG_TRACE("OPT:[COST INDEX BACK WITH COLUMN STORE]", K(row_count), K(network_cost), K(index_back_cost)); } @@ -1591,6 +1599,7 @@ int ObOptEstCostModel::cost_row_store_index_scan(const ObCostTableScanInfo &est_ } else if (est_cost_info.index_meta_info_.is_geo_index_) { double spatial_cost = row_count * cost_params_.get_spatial_per_row_cost(sys_stat_); index_scan_cost += spatial_cost; + OPT_TRACE_COST_MODEL(KV(index_scan_cost), "+=", KV(spatial_cost)); LOG_TRACE("OPT::[COST SPATIAL INDEX SCAN]", K(spatial_cost), K(ret)); } else if (est_cost_info.index_meta_info_.is_fulltext_index_) { // 全文索引一期:对于每一个 token,都需要: @@ -1628,6 +1637,7 @@ int ObOptEstCostModel::cost_row_store_index_scan(const ObCostTableScanInfo &est_ if (OB_FAIL(ret)) { } else if (!est_cost_info.ss_ranges_.empty()) { index_scan_cost *= est_cost_info.ss_prefix_ndv_; + OPT_TRACE_COST_MODEL(KV(index_scan_cost), "*=", KV_(est_cost_info.ss_prefix_ndv)); LOG_TRACE("OPT::[COST INDEX SKIP SCAN]", K(est_cost_info.ss_prefix_ndv_), K(index_scan_cost)); } return ret; @@ -1653,6 +1663,7 @@ int ObOptEstCostModel::cost_row_store_index_back(const ObCostTableScanInfo &est_ LOG_WARN("failed to get newwork transform cost for global index", K(ret)); } else { index_back_cost += network_cost; + OPT_TRACE_COST_MODEL(KV(index_back_cost), "+=", KV(network_cost)); LOG_TRACE("OPT:[COST ROW STORE INDEX BACK]", K(index_back_row_count), K(network_cost), K(index_back_cost)); } @@ -1665,11 +1676,11 @@ int ObOptEstCostModel::cost_row_store_index_back(const ObCostTableScanInfo &est_ */ int ObOptEstCostModel::cost_global_index_back_with_rp(double row_count, const ObCostTableScanInfo &est_cost_info, - double &cost) + double &network_cost) { int ret = OB_SUCCESS; const ObTableMetaInfo *table_meta_info = est_cost_info.table_meta_info_; - cost = 0.0; + network_cost = 0.0; if (OB_ISNULL(table_meta_info) || OB_UNLIKELY(table_meta_info->table_column_count_ <= 0)) { ret = OB_ERR_UNEXPECTED; @@ -1678,9 +1689,12 @@ int ObOptEstCostModel::cost_global_index_back_with_rp(double row_count, double column_count = est_cost_info.access_column_items_.count(); double transform_size = (table_meta_info->average_row_size_ * row_count * column_count) /static_cast(table_meta_info->table_column_count_); - cost = transform_size * cost_params_.get_network_trans_per_byte_cost(sys_stat_) + + network_cost = transform_size * cost_params_.get_network_trans_per_byte_cost(sys_stat_) + row_count * cost_params_.get_table_loopup_per_row_rpc_cost(sys_stat_); - LOG_TRACE("OPT::[COST GLOBAL INDEX BACK WITH RPC]", K(cost), K(table_meta_info->average_row_size_), + OPT_TRACE_COST_MODEL(KV(network_cost), "=", KV(transform_size), "*", + cost_params_.get_network_trans_per_byte_cost(sys_stat_), "+", + KV(row_count), "*", cost_params_.get_table_loopup_per_row_rpc_cost(sys_stat_)); + LOG_TRACE("OPT::[COST GLOBAL INDEX BACK WITH RPC]", K(network_cost), K(table_meta_info->average_row_size_), K(row_count), K(table_meta_info->table_column_count_)); } return ret; @@ -1689,7 +1703,7 @@ int ObOptEstCostModel::cost_global_index_back_with_rp(double row_count, int ObOptEstCostModel::cost_range_scan(const ObCostTableScanInfo &est_cost_info, bool is_scan_index, double row_count, - double &cost) + double &range_scan_cost) { int ret = OB_SUCCESS; // 从memtable读取数据的代价,待提供 @@ -1711,11 +1725,15 @@ int ObOptEstCostModel::cost_range_scan(const ObCostTableScanInfo &est_cost_info, LOG_WARN("failed to calc table scan cpu cost", K(ret)); } else { if (io_cost > cpu_cost) { - cost = io_cost + memtable_cost + memtable_merge_cost; + range_scan_cost = io_cost + memtable_cost + memtable_merge_cost; + OPT_TRACE_COST_MODEL(KV(range_scan_cost), "=", KV(io_cost), "+", + KV(memtable_cost), "+", KV(memtable_merge_cost)); } else { - cost = cpu_cost + memtable_cost + memtable_merge_cost; + range_scan_cost = cpu_cost + memtable_cost + memtable_merge_cost; + OPT_TRACE_COST_MODEL(KV(range_scan_cost), "=", KV(cpu_cost), "+", + KV(memtable_cost), "+", KV(memtable_merge_cost)); } - LOG_TRACE("OPT:[COST RANGE SCAN]", K(is_scan_index), K(row_count), K(cost), + LOG_TRACE("OPT:[COST RANGE SCAN]", K(is_scan_index), K(row_count), K(range_scan_cost), K(io_cost), K(cpu_cost), K(memtable_cost), K(memtable_merge_cost)); } return ret; @@ -1724,7 +1742,7 @@ int ObOptEstCostModel::cost_range_scan(const ObCostTableScanInfo &est_cost_info, int ObOptEstCostModel::cost_range_get(const ObCostTableScanInfo &est_cost_info, bool is_scan_index, double row_count, - double &cost) + double &range_get_cost) { int ret = OB_SUCCESS; // 从memtable读取数据的代价,待提供 @@ -1746,8 +1764,11 @@ int ObOptEstCostModel::cost_range_get(const ObCostTableScanInfo &est_cost_info, LOG_WARN("failed to calc table scan cpu cost", K(ret)); } else { double fetch_row_cost = cost_params_.get_fetch_row_rnd_cost(sys_stat_) * row_count; - cost = cpu_cost + io_cost + fetch_row_cost + memtable_cost + memtable_merge_cost; - LOG_TRACE("OPT:[COST RANGE GET]", K(is_scan_index), K(row_count), K(cost), + OPT_TRACE_COST_MODEL(KV(fetch_row_cost), "=", cost_params_.get_fetch_row_rnd_cost(sys_stat_), "*", KV(row_count)); + range_get_cost = cpu_cost + io_cost + fetch_row_cost + memtable_cost + memtable_merge_cost; + OPT_TRACE_COST_MODEL(KV(range_get_cost), "=", KV(cpu_cost), "+", KV(io_cost), "+", KV(fetch_row_cost), + KV(memtable_cost), "+", KV(memtable_merge_cost)); + LOG_TRACE("OPT:[COST RANGE GET]", K(is_scan_index), K(row_count), K(range_get_cost), K(io_cost), K(cpu_cost), K(fetch_row_cost), K(memtable_cost), K(memtable_merge_cost)); } return ret; @@ -1795,8 +1816,11 @@ int ObOptEstCostModel::range_get_io_cost(const ObCostTableScanInfo &est_cost_inf } if (num_micro_blocks_read < 1) { io_cost = 0; + OPT_TRACE_COST_MODEL(KV(io_cost), "= 0"); } else { io_cost = first_block_cost + cost_params_.get_micro_block_rnd_cost(sys_stat_) * (num_micro_blocks_read-1); + OPT_TRACE_COST_MODEL(KV(io_cost), "=", KV(first_block_cost), "+", + cost_params_.get_micro_block_rnd_cost(sys_stat_), "* (", KV(num_micro_blocks_read), "-1)"); } LOG_TRACE("OPT:[COST RANGE GET IO]", K(is_scan_index), K(row_count), K(io_cost), K(num_micro_blocks), K(num_micro_blocks_read), K(first_block_cost)); @@ -1845,8 +1869,11 @@ int ObOptEstCostModel::range_scan_io_cost(const ObCostTableScanInfo &est_cost_in } if (num_micro_blocks_read < 1) { io_cost = first_block_cost; + OPT_TRACE_COST_MODEL(KV(io_cost), "=", KV(first_block_cost)); } else { io_cost = first_block_cost + cost_params_.get_micro_block_seq_cost(sys_stat_) * (num_micro_blocks_read-1); + OPT_TRACE_COST_MODEL(KV(io_cost), "=", KV(first_block_cost), "+", + cost_params_.get_micro_block_seq_cost(sys_stat_), "* (", KV(num_micro_blocks_read), "-1)"); } LOG_TRACE("OPT:[COST RANGE SCAN IO]", K(is_scan_index), K(row_count), K(io_cost), K(num_micro_blocks), K(num_micro_blocks_read), K(first_block_cost)); @@ -1920,7 +1947,9 @@ int ObOptEstCostModel::range_scan_cpu_cost(const ObCostTableScanInfo &est_cost_i } range_cost = range_count * cost_params_.get_range_cost(sys_stat_); cpu_cost = row_count * cost_params_.get_cpu_tuple_cost(sys_stat_); + OPT_TRACE_COST_MODEL(KV(cpu_cost), "=", KV(row_count), "*", cost_params_.get_cpu_tuple_cost(sys_stat_)); cpu_cost += range_cost + qual_cost + project_cost; + OPT_TRACE_COST_MODEL(KV(cpu_cost), "+=", KV(range_cost), "+", KV(qual_cost), "+", KV(project_cost)); LOG_TRACE("OPT: [RANGE SCAN CPU COST]", K(is_scan_index), K(is_get), K(cpu_cost), K(qual_cost), K(project_cost), K(range_cost), K(row_count)); } diff --git a/src/sql/optimizer/ob_optimizer.cpp b/src/sql/optimizer/ob_optimizer.cpp index 7891ee80bc..93ba34c375 100644 --- a/src/sql/optimizer/ob_optimizer.cpp +++ b/src/sql/optimizer/ob_optimizer.cpp @@ -114,6 +114,7 @@ int ObOptimizer::get_optimization_cost(ObDMLStmt &stmt, LOG_WARN("failed to perform optimization", K(ret)); } else { cost = plan->get_optimization_cost(); + OPT_TRACE(plan); } return ret; } diff --git a/src/sql/printer/ob_raw_expr_printer.cpp b/src/sql/printer/ob_raw_expr_printer.cpp index 04ef24e833..bbba7b4bbe 100644 --- a/src/sql/printer/ob_raw_expr_printer.cpp +++ b/src/sql/printer/ob_raw_expr_printer.cpp @@ -1024,6 +1024,8 @@ int ObRawExprPrinter::print(ObAggFunRawExpr *expr) switch (type) { case T_FUN_COUNT: SET_SYMBOL_IF_EMPTY("count"); + case T_FUN_COUNT_SUM: + SET_SYMBOL_IF_EMPTY("count_sum"); case T_FUN_MAX: SET_SYMBOL_IF_EMPTY("max"); case T_FUN_MIN: diff --git a/src/sql/rewrite/ob_transform_groupby_pullup.cpp b/src/sql/rewrite/ob_transform_groupby_pullup.cpp index c6c489a41a..698ec1af6b 100644 --- a/src/sql/rewrite/ob_transform_groupby_pullup.cpp +++ b/src/sql/rewrite/ob_transform_groupby_pullup.cpp @@ -1113,9 +1113,7 @@ int ObTransformGroupByPullup::check_original_plan_validity(ObLogicalOperator* ro LOG_WARN("failed to check all table has statistics", K(ret)); } else if (!has_stats) { is_valid = false; - RESUME_OPT_TRACE OPT_TRACE("check original plan has statistics:", has_stats); - STOP_OPT_TRACE } else if (OB_FAIL(extract_columns_in_join_conditions(parent_ops, view_table_id, column_exprs))) { @@ -1137,11 +1135,9 @@ int ObTransformGroupByPullup::check_original_plan_validity(ObLogicalOperator* ro double expansion_rate = card / group_ndv; is_valid = expansion_rate < groupby_nopushdown_cut_ratio; LOG_TRACE("check original plan", K(is_valid), K(group_exprs), K(group_ndv), K(expansion_rate)); - RESUME_OPT_TRACE OPT_TRACE("check original plan group by exprs:", group_exprs); OPT_TRACE("check original plan group by ndv:", group_ndv); OPT_TRACE("check original plan expansion rate:", expansion_rate); - STOP_OPT_TRACE } return ret; } diff --git a/src/sql/rewrite/ob_transform_rule.cpp b/src/sql/rewrite/ob_transform_rule.cpp index cf950537b6..94216c61bc 100644 --- a/src/sql/rewrite/ob_transform_rule.cpp +++ b/src/sql/rewrite/ob_transform_rule.cpp @@ -303,7 +303,7 @@ int ObTransformRule::accept_transform(common::ObIArray &parent_ ObDMLStmt *tmp1 = NULL; ObDMLStmt *tmp2 = NULL; cost_based_trans_tried_ = true; - STOP_OPT_TRACE; + BEGIN_OPT_TRACE_EVA_COST; if (OB_ISNULL(ctx_) || OB_ISNULL(stmt) || OB_ISNULL(trans_stmt) || OB_ISNULL(top_stmt)) { ret = OB_ERR_UNEXPECTED; LOG_WARN("context is null", K(ret), K(ctx_), K(stmt), K(trans_stmt), K(top_stmt)); @@ -333,7 +333,7 @@ int ObTransformRule::accept_transform(common::ObIArray &parent_ } ctx_->in_accept_transform_ = false; } - RESUME_OPT_TRACE; + END_OPT_TRACE_EVA_COST; if (OB_FAIL(ret)) { } else if (!trans_happened) { diff --git a/src/sql/rewrite/ob_transform_temp_table.cpp b/src/sql/rewrite/ob_transform_temp_table.cpp index b352aa0e4f..eef648ecd6 100644 --- a/src/sql/rewrite/ob_transform_temp_table.cpp +++ b/src/sql/rewrite/ob_transform_temp_table.cpp @@ -2395,7 +2395,7 @@ int ObTransformTempTable::accept_cte_transform(ObDMLStmt &origin_root_stmt, double temp_table_costs = 0.0; double dummy = 0.0; double temp_table_profit = 0.0; - STOP_OPT_TRACE; + BEGIN_OPT_TRACE_EVA_COST; if (OB_ISNULL(ctx_) || OB_UNLIKELY(origin_stmts.count() != trans_stmts.count())) { ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected param", K(ret), K(ctx_)); @@ -2416,7 +2416,7 @@ int ObTransformTempTable::accept_cte_transform(ObDMLStmt &origin_root_stmt, ret = OB_ERR_UNEXPECTED; LOG_WARN("unexpected array size", K(origin_costs), K(trans_costs), K(trans_happened)); } - RESUME_OPT_TRACE; + END_OPT_TRACE_EVA_COST; if (OB_SUCC(ret)) { if (!force_accept) { // Only consider stmt whose cost is reduced after extracting cte. diff --git a/src/sql/session/ob_basic_session_info.cpp b/src/sql/session/ob_basic_session_info.cpp index 9c205156fc..031b57212b 100644 --- a/src/sql/session/ob_basic_session_info.cpp +++ b/src/sql/session/ob_basic_session_info.cpp @@ -42,6 +42,7 @@ #include "rpc/obmysql/ob_sql_sock_session.h" #include "sql/engine/expr/ob_expr_regexp_context.h" #include "share/ob_compatibility_control.h" +#include "sql/ob_optimizer_trace_impl.h" using namespace oceanbase::common; using namespace oceanbase::share; @@ -2818,6 +2819,21 @@ int ObBasicSessionInfo::dump_all_sys_vars() const return ret; } +void ObBasicSessionInfo::trace_all_sys_vars() const +{ + int ret = OB_SUCCESS; + int64_t store_idx = OB_INVALID_INDEX_INT64; + int64_t var_amount = ObSysVariables::get_amount(); + for (int64_t i = 0; OB_SUCC(ret) && i < var_amount; ++i) { + store_idx = ObSysVarsToIdxMap::get_store_idx((int64_t)ObSysVariables::get_sys_var_id(i)); + OV (0 <= store_idx && store_idx < ObSysVarFactory::ALL_SYS_VARS_COUNT); + OV (OB_NOT_NULL(sys_vars_[store_idx])); + if (OB_SUCC(ret) && (sys_vars_[store_idx]->get_value() != sys_vars_[store_idx]->get_global_default_value())) { + OPT_TRACE(" ", sys_vars_[store_idx]->get_name(), " = ", sys_vars_[store_idx]->get_value()); + } + } +} + int ObBasicSessionInfo::init_sys_vars_cache_base_values() { int ret = OB_SUCCESS; diff --git a/src/sql/session/ob_basic_session_info.h b/src/sql/session/ob_basic_session_info.h index 3821dbde80..b1a695976f 100644 --- a/src/sql/session/ob_basic_session_info.h +++ b/src/sql/session/ob_basic_session_info.h @@ -1419,6 +1419,7 @@ public: int get_compatibility_version(uint64_t &compat_version) const; int get_security_version(uint64_t &security_version) const; int check_feature_enable(const share::ObCompatFeatureType feature_type, bool &is_enable) const; + void trace_all_sys_vars() const; protected: int process_session_variable(share::ObSysVarClassType var, const common::ObObj &value, const bool check_timezone_valid = true,