提交 aa6c3e12 编写于 作者: O obdev 提交者: ob-robot

[CP] Improve query range extraction efficiency when explain sql with single in

上级 d93395d1
......@@ -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));
}
}
}
}
......
......@@ -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<ObKeyPartPos*, 8> key_part_pos_array_;
bool use_in_optimization_;
ObSEArray<int64_t, 4> row_in_offsets_;
bool only_one_expr_;
};
public:
enum ObQueryRangeState
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册