This is an automated email from the ASF dual-hosted git repository. lihaopeng pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 0c97e0470f2 [Exec](expr) Opt the compound pred performace (#45414) 0c97e0470f2 is described below commit 0c97e0470f20a85f27d9d63673f1f3b44a82f164 Author: HappenLee <happen...@selectdb.com> AuthorDate: Mon Dec 16 10:52:10 2024 +0800 [Exec](expr) Opt the compound pred performace (#45414) before: ``` mysqlslap -hd3 -uroot -P9130 --create-schema=test_db2 -c 10 -i 500 -q "SELECT count(k) FROM sbtest1_dup WHERE k BETWEEN 4850578 AND 8454295 OR k BETWEEN 8776291 AND 29749077;" Benchmark Average number of seconds to run all queries: 0.041 seconds Minimum number of seconds to run all queries: 0.037 seconds Maximum number of seconds to run all queries: 0.115 seconds Number of clients running queries: 10 Average number of queries per client: 1 ``` after: ``` mysqlslap -hd3 -uroot -P9030 --create-schema=test_db -c 10 -i 500 -q "SELECT count(k) FROM sbtest1 WHERE k BETWEEN 4850578 AND 8454295 OR k BETWEEN 8776291 AND 29749077;" Benchmark Average number of seconds to run all queries: 0.029 seconds Minimum number of seconds to run all queries: 0.027 seconds Maximum number of seconds to run all queries: 0.034 seconds Number of clients running queries: 10 Average number of queries per client: 1 ``` --- be/src/vec/exprs/vcompound_pred.h | 82 ++++++++++++++++++++++++++++----------- 1 file changed, 60 insertions(+), 22 deletions(-) diff --git a/be/src/vec/exprs/vcompound_pred.h b/be/src/vec/exprs/vcompound_pred.h index 88f3e474b58..8c6832a7a35 100644 --- a/be/src/vec/exprs/vcompound_pred.h +++ b/be/src/vec/exprs/vcompound_pred.h @@ -158,12 +158,15 @@ public: if (_can_fast_execute && fast_execute(context, block, result_column_id)) { return Status::OK(); } - if (get_num_children() == 1 || !_all_child_is_compound_and_not_const()) { + if (get_num_children() == 1 || _has_const_child()) { return VectorizedFnCall::execute(context, block, result_column_id); } int lhs_id = -1; int rhs_id = -1; + bool lhs_mem_can_reuse = _children[0]->is_compound_predicate(); + bool rhs_mem_can_reuse = _children[1]->is_compound_predicate(); + RETURN_IF_ERROR(_children[0]->execute(context, block, &lhs_id)); ColumnPtr lhs_column = block->get_by_position(lhs_id).column->convert_to_full_column_if_const(); @@ -210,13 +213,22 @@ public: return Status::OK(); }; - auto return_result_column_id = [&](ColumnPtr res_column, int res_id) -> int { + auto return_result_column_id = [&](ColumnPtr res_column, int res_id, + bool mem_reuse) -> int { + if (!mem_reuse) { + res_column = res_column->clone_resized(size); + } + if (result_is_nullable && !res_column->is_nullable()) { auto result_column = ColumnNullable::create(res_column, ColumnUInt8::create(size, 0)); res_id = block->columns(); block->insert({std::move(result_column), _data_type, _expr_name}); + } else if (!mem_reuse) { + res_id = block->columns(); + block->insert({std::move(res_column), _data_type, _expr_name}); } + return res_id; }; @@ -231,6 +243,33 @@ public: return null_map_data; }; + auto vector_vector = [&]<bool is_and_op>() { + if (lhs_mem_can_reuse) { + *result_column_id = lhs_id; + } else if (rhs_mem_can_reuse) { + *result_column_id = rhs_id; + + auto tmp_column = rhs_data_column; + rhs_data_column = lhs_data_column; + lhs_data_column = tmp_column; + } else { + *result_column_id = block->columns(); + + auto col_res = lhs_column->clone_resized(size); + lhs_data_column = assert_cast<ColumnUInt8*>(col_res.get())->get_data().data(); + block->insert({std::move(col_res), _data_type, _expr_name}); + } + + if constexpr (is_and_op) { + for (size_t i = 0; i < size; ++i) { + lhs_data_column[i] &= rhs_data_column[i]; + } + } else { + for (size_t i = 0; i < size; ++i) { + lhs_data_column[i] |= rhs_data_column[i]; + } + } + }; auto vector_vector_null = [&]<bool is_and_op>() { auto col_res = ColumnUInt8::create(size); auto col_nulls = ColumnUInt8::create(size); @@ -269,28 +308,28 @@ public: //2. nullable column: null map all is not null if ((lhs_all_false && !lhs_is_nullable) || (lhs_all_false && lhs_all_is_not_null)) { // false and any = false, return lhs - *result_column_id = return_result_column_id(lhs_column, lhs_id); + *result_column_id = return_result_column_id(lhs_column, lhs_id, lhs_mem_can_reuse); } else { RETURN_IF_ERROR(get_rhs_colum()); if ((lhs_all_true && !lhs_is_nullable) || //not null column (lhs_all_true && lhs_all_is_not_null)) { //nullable column // true and any = any, return rhs - *result_column_id = return_result_column_id(rhs_column, rhs_id); + *result_column_id = + return_result_column_id(rhs_column, rhs_id, rhs_mem_can_reuse); } else if ((rhs_all_false && !rhs_is_nullable) || (rhs_all_false && rhs_all_is_not_null)) { // any and false = false, return rhs - *result_column_id = return_result_column_id(rhs_column, rhs_id); + *result_column_id = + return_result_column_id(rhs_column, rhs_id, rhs_mem_can_reuse); } else if ((rhs_all_true && !rhs_is_nullable) || (rhs_all_true && rhs_all_is_not_null)) { // any and true = any, return lhs - *result_column_id = return_result_column_id(lhs_column, lhs_id); + *result_column_id = + return_result_column_id(lhs_column, lhs_id, lhs_mem_can_reuse); } else { if (!result_is_nullable) { - *result_column_id = lhs_id; - for (size_t i = 0; i < size; i++) { - lhs_data_column[i] &= rhs_data_column[i]; - } + vector_vector.template operator()<true>(); } else { vector_vector_null.template operator()<true>(); } @@ -301,26 +340,26 @@ public: // false or NULL ----> NULL if ((lhs_all_true && !lhs_is_nullable) || (lhs_all_true && lhs_all_is_not_null)) { // true or any = true, return lhs - *result_column_id = return_result_column_id(lhs_column, lhs_id); + *result_column_id = return_result_column_id(lhs_column, lhs_id, lhs_mem_can_reuse); } else { RETURN_IF_ERROR(get_rhs_colum()); if ((lhs_all_false && !lhs_is_nullable) || (lhs_all_false && lhs_all_is_not_null)) { // false or any = any, return rhs - *result_column_id = return_result_column_id(rhs_column, rhs_id); + *result_column_id = + return_result_column_id(rhs_column, rhs_id, rhs_mem_can_reuse); } else if ((rhs_all_true && !rhs_is_nullable) || (rhs_all_true && rhs_all_is_not_null)) { // any or true = true, return rhs - *result_column_id = return_result_column_id(rhs_column, rhs_id); + *result_column_id = + return_result_column_id(rhs_column, rhs_id, rhs_mem_can_reuse); } else if ((rhs_all_false && !rhs_is_nullable) || (rhs_all_false && rhs_all_is_not_null)) { // any or false = any, return lhs - *result_column_id = return_result_column_id(lhs_column, lhs_id); + *result_column_id = + return_result_column_id(lhs_column, lhs_id, lhs_mem_can_reuse); } else { if (!result_is_nullable) { - *result_column_id = lhs_id; - for (size_t i = 0; i < size; i++) { - lhs_data_column[i] |= rhs_data_column[i]; - } + vector_vector.template operator()<false>(); } else { vector_vector_null.template operator()<false>(); } @@ -345,10 +384,9 @@ private: return (l_null & r_null) | (r_null & (r_null ^ a)) | (l_null & (l_null ^ b)); } - bool _all_child_is_compound_and_not_const() const { - return std::ranges::all_of(_children, [](const VExprSPtr& arg) -> bool { - return arg->is_compound_predicate() && !arg->is_constant(); - }); + bool _has_const_child() const { + return std::ranges::any_of(_children, + [](const VExprSPtr& arg) -> bool { return arg->is_constant(); }); } std::pair<uint8*, uint8*> _get_raw_data_and_null_map(ColumnPtr column, --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org