From 79a142081ddc24bac38c47efeaa14a7aa3be8c66 Mon Sep 17 00:00:00 2001 From: LiuYoung00 Date: Mon, 19 Feb 2024 10:41:52 +0000 Subject: [PATCH] [to #54988775]alloc result for each prepare in prexecute --- .../optimizer/ob_access_path_estimation.cpp | 19 ++++++++++--------- src/sql/optimizer/ob_access_path_estimation.h | 1 - src/sql/optimizer/ob_dynamic_sampling.cpp | 18 ++++++++++++------ src/sql/optimizer/ob_dynamic_sampling.h | 4 ++-- src/sql/resolver/dml/ob_dml_resolver.cpp | 6 ++---- 5 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/sql/optimizer/ob_access_path_estimation.cpp b/src/sql/optimizer/ob_access_path_estimation.cpp index 82f4aa840..3aa7aa52e 100644 --- a/src/sql/optimizer/ob_access_path_estimation.cpp +++ b/src/sql/optimizer/ob_access_path_estimation.cpp @@ -45,7 +45,7 @@ int ObAccessPathEstimation::estimate_rowcount(ObOptimizerContext &ctx, LOG_WARN("failed to get valid est methods", K(ret)); } else if (OB_FAIL(choose_best_est_method(ctx, paths, filter_exprs, valid_methods, method))) { LOG_WARN("failed to choose one est method", K(ret), K(valid_methods)); - } else if (OB_FAIL(do_estimate_rowcount(ctx, paths, is_inner_path, filter_exprs, valid_methods, method))) { + } else if (OB_FAIL(do_estimate_rowcount(ctx, paths, is_inner_path, filter_exprs, method))) { LOG_WARN("failed to do estimate rowcount", K(ret), K(method), K(valid_methods)); } for (int64_t i = 0; OB_SUCC(ret) && i < paths.count(); i ++) { @@ -63,7 +63,6 @@ int ObAccessPathEstimation::do_estimate_rowcount(ObOptimizerContext &ctx, common::ObIArray &paths, const bool is_inner_path, const ObIArray &filter_exprs, - ObBaseTableEstMethod &valid_methods, ObBaseTableEstMethod &method) { int ret = OB_SUCCESS; @@ -83,11 +82,9 @@ int ObAccessPathEstimation::do_estimate_rowcount(ObOptimizerContext &ctx, ctx, paths, is_inner_path, filter_exprs, only_ds_basic_stat, is_success))) { LOG_WARN("failed to process statistics estimation", K(ret)); } else if (!is_success) { - valid_methods &= ~EST_DS_BASIC; - valid_methods &= ~EST_DS_FULL; - if (OB_FAIL(choose_best_est_method(ctx, paths, filter_exprs, valid_methods, method))) { - LOG_WARN("failed to choose one est method", K(ret), K(valid_methods)); - } + method &= ~EST_DS_BASIC; + method &= ~EST_DS_FULL; + method |= EST_DEFAULT; } } @@ -212,6 +209,7 @@ int ObAccessPathEstimation::check_can_use_dynamic_sampling(ObOptimizerContext &c int64_t sample_block_cnt = 0; bool specify_ds = false; bool has_invalid_ds_filters = false; + int64_t max_ds_timeout = 0; const ObBaseTableEstMethod EST_DS_METHODS = EST_DS_BASIC | EST_DS_FULL; if (OB_FAIL(ObDynamicSamplingUtils::get_valid_dynamic_sampling_level( ctx.get_session_info(), @@ -221,8 +219,10 @@ int ObAccessPathEstimation::check_can_use_dynamic_sampling(ObOptimizerContext &c sample_block_cnt, specify_ds))) { LOG_WARN("failed to get valid dynamic sampling level", K(ret)); + } else if (OB_FAIL(ObDynamicSamplingUtils::get_dynamic_sampling_max_timeout(ctx, max_ds_timeout))) { + LOG_WARN("failed to get dynamic sampling max timeout", K(ret)); } else if (ObDynamicSamplingLevel::NO_DYNAMIC_SAMPLING == ds_level || - ObDynamicSamplingUtils::get_dynamic_sampling_max_timeout(ctx) <= 0) { + max_ds_timeout <= 0) { valid_methods &= ~EST_DS_METHODS; } else if (ObDynamicSamplingUtils::check_is_failed_ds_table(table_meta.get_ref_table_id(), table_meta.get_all_used_parts(), @@ -1671,7 +1671,8 @@ int ObAccessPathEstimation::process_dynamic_sampling_estimation(ObOptimizerConte ds_table_param, specify_ds))) { LOG_WARN("failed to get ds table param", K(ret), K(ds_table_param)); } else if (!ds_table_param.is_valid()) { - is_success = false; + ret = OB_ERR_UNEXPECTED; + LOG_WARN("get invalid ds table param", K(ret), K(ds_table_param)); } else if (OB_FAIL(add_ds_result_items(paths, filter_exprs, specify_ds, ds_result_items, only_ds_basic_stat))) { LOG_WARN("failed to init ds result items", K(ret)); diff --git a/src/sql/optimizer/ob_access_path_estimation.h b/src/sql/optimizer/ob_access_path_estimation.h index 6e4efadce..69a05a23c 100644 --- a/src/sql/optimizer/ob_access_path_estimation.h +++ b/src/sql/optimizer/ob_access_path_estimation.h @@ -89,7 +89,6 @@ private: common::ObIArray &paths, const bool is_inner_path, const ObIArray &filter_exprs, - ObBaseTableEstMethod &valid_methods, ObBaseTableEstMethod &method); static int process_common_estimate_rowcount(ObOptimizerContext &ctx, diff --git a/src/sql/optimizer/ob_dynamic_sampling.cpp b/src/sql/optimizer/ob_dynamic_sampling.cpp index 414c511bc..2071a475a 100644 --- a/src/sql/optimizer/ob_dynamic_sampling.cpp +++ b/src/sql/optimizer/ob_dynamic_sampling.cpp @@ -1308,7 +1308,9 @@ int ObDynamicSamplingUtils::get_ds_table_param(ObOptimizerContext &ctx, table_meta->get_ref_table_id(), ds_table_param.degree_))) { LOG_WARN("failed to get ds table degree", K(ret)); - } else if ((ds_table_param.max_ds_timeout_ = get_dynamic_sampling_max_timeout(ctx)) > 0) { + } else if (OB_FAIL(get_dynamic_sampling_max_timeout(ctx, ds_table_param.max_ds_timeout_))) { + LOG_WARN("failed to get dynamic sampling max timeout", K(ret)); + } else { ds_table_param.tenant_id_ = ctx.get_session_info()->get_effective_tenant_id(); ds_table_param.table_id_ = table_meta->get_ref_table_id(); ds_table_param.ds_level_ = ds_level; @@ -1519,11 +1521,15 @@ const ObDSResultItem *ObDynamicSamplingUtils::get_ds_result_item(ObDSResultItemT return item; } -int64_t ObDynamicSamplingUtils::get_dynamic_sampling_max_timeout(ObOptimizerContext &ctx) +int ObDynamicSamplingUtils::get_dynamic_sampling_max_timeout(ObOptimizerContext &ctx, + int64_t &max_ds_timeout) { - int64_t max_ds_timeout = 0; - if (THIS_WORKER.get_timeout_remain() / 10 >= OB_DS_MIN_QUERY_TIMEOUT) { - max_ds_timeout = THIS_WORKER.get_timeout_remain() / 10;//default ds time can't exceed 10% of current sql remain timeout + int ret = OB_SUCCESS; + if (OB_FAIL(THIS_WORKER.check_status())) { + LOG_WARN("failed to check status", K(ret)); + } else { + max_ds_timeout = THIS_WORKER.get_timeout_remain(); + max_ds_timeout = max_ds_timeout / 10;//default ds time can't exceed 10% of current sql remain timeout omt::ObTenantConfigGuard tenant_config(TENANT_CONF(ctx.get_session_info()->get_effective_tenant_id())); if (tenant_config.is_valid()) { int64_t ds_maximum_time = tenant_config->_optimizer_ads_time_limit * 1000000; @@ -1532,7 +1538,7 @@ int64_t ObDynamicSamplingUtils::get_dynamic_sampling_max_timeout(ObOptimizerCont } } } - return max_ds_timeout; + return ret; } int ObDynamicSamplingUtils::add_failed_ds_table_list(const uint64_t table_id, diff --git a/src/sql/optimizer/ob_dynamic_sampling.h b/src/sql/optimizer/ob_dynamic_sampling.h index dc9449ce0..0586f0775 100644 --- a/src/sql/optimizer/ob_dynamic_sampling.h +++ b/src/sql/optimizer/ob_dynamic_sampling.h @@ -199,7 +199,6 @@ static T *copy_ds_stat_item(ObIAllocator &allocator, const T &src) const int64_t OB_DS_BASIC_SAMPLE_MICRO_CNT = 32; const int64_t OB_DS_MAX_FILTER_EXPR_COUNT = 10000; -const int64_t OB_DS_MIN_QUERY_TIMEOUT = 1000;//Dynamic sampling requires a minimum timeout of 1ms. //const int64_t OB_OPT_DS_ADAPTIVE_SAMPLE_MICRO_CNT = 200; //const int64_t OB_OPT_DS_MAX_TIMES = 7; @@ -367,7 +366,8 @@ public: uint64_t index_id, const ObIArray &ds_result_items); - static int64_t get_dynamic_sampling_max_timeout(ObOptimizerContext &ctx); + static int get_dynamic_sampling_max_timeout(ObOptimizerContext &ctx, + int64_t &max_ds_timeout); static int add_failed_ds_table_list(const uint64_t table_id, const common::ObIArray &used_part_id, diff --git a/src/sql/resolver/dml/ob_dml_resolver.cpp b/src/sql/resolver/dml/ob_dml_resolver.cpp index 4ee1972aa..8b82508a5 100755 --- a/src/sql/resolver/dml/ob_dml_resolver.cpp +++ b/src/sql/resolver/dml/ob_dml_resolver.cpp @@ -10827,10 +10827,8 @@ int ObDMLResolver::format_from_subquery(const ObString &unpivot_alias_name, ret = OB_ERR_UNEXPECTED; LOG_WARN("get unexpected null pointer", K(ret)); } else if (table_item.is_basic_table() || table_item.is_link_table()) { - if (OB_FAIL(sql.append_fmt(" FROM \"%.*s\".\"%.*s\"", table_item.database_name_.length(), - table_item.database_name_.ptr(), - table_item.table_name_.length(), - table_item.table_name_.ptr()))) { + if (OB_FAIL(sql.append_fmt(" FROM %.*s", table_item.table_name_.length(), + table_item.table_name_.ptr()))) { LOG_WARN("fail to append_fmt", K(table_item.table_name_), K(ret)); } else if (OB_FAIL(get_partition_for_transpose(table_item, sql))) { LOG_WARN("fail to get_partition_for_transpose", K(table_item), K(ret));