From aa6c3e121aa26a72e36c60496d8ef53eaa3c5996 Mon Sep 17 00:00:00 2001 From: obdev Date: Wed, 15 Nov 2023 15:10:17 +0000 Subject: [PATCH] [CP] Improve query range extraction efficiency when explain sql with single in --- src/sql/rewrite/ob_query_range.cpp | 20 +++++++++++++++----- src/sql/rewrite/ob_query_range.h | 4 +++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/sql/rewrite/ob_query_range.cpp b/src/sql/rewrite/ob_query_range.cpp index 55a395fba9..dab9c78cd5 100644 --- a/src/sql/rewrite/ob_query_range.cpp +++ b/src/sql/rewrite/ob_query_range.cpp @@ -276,6 +276,7 @@ int ObQueryRange::preliminary_extract_query_range(const ColumnIArray &range_colu LOG_WARN("query_range_ctx_ is not inited.", K(ret)); } else { query_range_ctx_->need_final_extract_ = false; + query_range_ctx_->only_one_expr_ = true; ObKeyPart *root = NULL; if (OB_UNLIKELY(NULL == expr_root)) { //(MIN, MAX), whole range @@ -760,6 +761,7 @@ int ObQueryRange::preliminary_extract_query_range(const ColumnIArray &range_colu LOG_WARN("add key part range failed", K(ret)); } } else { + query_range_ctx_->only_one_expr_ = candi_exprs.count() == 1; for (int64_t i = 0; OB_SUCC(ret) && i < candi_exprs.count(); ++i) { const ObRawExpr *cur_expr = candi_exprs.at(i); if (OB_ISNULL(cur_expr)) { @@ -2691,11 +2693,19 @@ int ObQueryRange::pre_extract_single_in_op(const ObOpRawExpr *b_expr, out_key_part = find_false; } query_range_ctx_->cur_expr_is_precise_ = cur_in_is_precise; - ObKeyPartList key_part_list; - if (OB_FAIL(split_or(out_key_part, key_part_list))) { - LOG_WARN("split temp_result to or_list failed", K(ret)); - } else if (OB_FAIL(or_range_graph(key_part_list, NULL, out_key_part, dtc_params))) { - LOG_WARN("or range graph failed", K(ret)); + int64_t max_pos = -1; + int64_t cur_pos = out_key_part->pos_.offset_; + bool is_strict_equal = false; + if (query_range_ctx_->only_one_expr_ && + OB_FAIL(is_strict_equal_graph(out_key_part, cur_pos, max_pos, is_strict_equal))) { + LOG_WARN("is trict equal graph failed", K(ret)); + } else if (NULL != out_key_part && !is_strict_equal) { + ObKeyPartList key_part_list; + if (OB_FAIL(split_or(out_key_part, key_part_list))) { + LOG_WARN("split temp_result to or_list failed", K(ret)); + } else if (OB_FAIL(or_range_graph(key_part_list, NULL, out_key_part, dtc_params))) { + LOG_WARN("or range graph failed", K(ret)); + } } } } diff --git a/src/sql/rewrite/ob_query_range.h b/src/sql/rewrite/ob_query_range.h index 36e1a8be53..3408aa0761 100644 --- a/src/sql/rewrite/ob_query_range.h +++ b/src/sql/rewrite/ob_query_range.h @@ -99,7 +99,8 @@ private: expr_constraints_(expr_constraints), params_(params), use_in_optimization_(false), - row_in_offsets_() + row_in_offsets_(), + only_one_expr_(false) { } ~ObQueryRangeCtx() @@ -121,6 +122,7 @@ private: ObSEArray key_part_pos_array_; bool use_in_optimization_; ObSEArray row_in_offsets_; + bool only_one_expr_; }; public: enum ObQueryRangeState