This is an automated email from the ASF dual-hosted git repository. panxiaolei pushed a commit to branch tpc_preview_xl in repository https://gitbox.apache.org/repos/asf/doris.git
commit 2bc6a1a37970fbcdc4e5b4331c63b74b96ae1919 Author: BiteTheDDDDt <[email protected]> AuthorDate: Mon Jan 19 18:31:45 2026 +0800 adjust conjunct order by execute cost --- be/src/vec/exec/format/parquet/vparquet_group_reader.cpp | 3 +++ be/src/vec/exprs/vectorized_fn_call.cpp | 4 ++++ be/src/vec/exprs/vectorized_fn_call.h | 1 + be/src/vec/exprs/vexpr.h | 8 ++++++++ be/src/vec/exprs/vexpr_context.cpp | 4 ++++ be/src/vec/exprs/vexpr_context.h | 2 ++ be/src/vec/exprs/vruntimefilter_wrapper.h | 2 ++ be/src/vec/functions/function.h | 2 ++ be/src/vec/functions/functions_comparison.h | 2 ++ 9 files changed, 28 insertions(+) diff --git a/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp b/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp index d57264c1987..61d0956ad7f 100644 --- a/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp +++ b/be/src/vec/exec/format/parquet/vparquet_group_reader.cpp @@ -192,6 +192,9 @@ Status RowGroupReader::init( _lazy_read_ctx.missing_columns_conjuncts.end()); RETURN_IF_ERROR(_rewrite_dict_predicates()); } + std::ranges::sort(_filter_conjuncts, [](const VExprContextSPtr& a, const VExprContextSPtr& b) { + return a->execute_cost() < b->execute_cost(); + }); return Status::OK(); } diff --git a/be/src/vec/exprs/vectorized_fn_call.cpp b/be/src/vec/exprs/vectorized_fn_call.cpp index 591bb88cf8b..439b5c5caaf 100644 --- a/be/src/vec/exprs/vectorized_fn_call.cpp +++ b/be/src/vec/exprs/vectorized_fn_call.cpp @@ -641,5 +641,9 @@ Status VectorizedFnCall::evaluate_ann_range_search( return Status::OK(); } +double VectorizedFnCall::execute_cost() const { + return _function->execute_cost(); +} + #include "common/compile_check_end.h" } // namespace doris::vectorized diff --git a/be/src/vec/exprs/vectorized_fn_call.h b/be/src/vec/exprs/vectorized_fn_call.h index 78ccd56f7b6..0307a2b378f 100644 --- a/be/src/vec/exprs/vectorized_fn_call.h +++ b/be/src/vec/exprs/vectorized_fn_call.h @@ -65,6 +65,7 @@ public: const std::string& expr_name() const override; std::string function_name() const; std::string debug_string() const override; + double execute_cost() const override; bool is_blockable() const override { return _function->is_blockable() || std::any_of(_children.begin(), _children.end(), diff --git a/be/src/vec/exprs/vexpr.h b/be/src/vec/exprs/vexpr.h index 3b899d4e8aa..7cfe9430727 100644 --- a/be/src/vec/exprs/vexpr.h +++ b/be/src/vec/exprs/vexpr.h @@ -271,6 +271,14 @@ public: return expr; } + virtual double execute_cost() const { + double cost = 1.0; + for (const auto& child : _children) { + cost += child->execute_cost(); + } + return cost; + } + // If this expr is a RuntimeFilterWrapper, this method will return an underlying rf expression virtual VExprSPtr get_impl() const { return {}; } diff --git a/be/src/vec/exprs/vexpr_context.cpp b/be/src/vec/exprs/vexpr_context.cpp index 2a9c049e303..39a1e09c1b0 100644 --- a/be/src/vec/exprs/vexpr_context.cpp +++ b/be/src/vec/exprs/vexpr_context.cpp @@ -452,5 +452,9 @@ uint64_t VExprContext::get_digest(uint64_t seed) const { return _root->get_digest(seed); } +double VExprContext::execute_cost() const { + return _root->execute_cost(); +} + #include "common/compile_check_end.h" } // namespace doris::vectorized diff --git a/be/src/vec/exprs/vexpr_context.h b/be/src/vec/exprs/vexpr_context.h index 349f199af23..57136f49c78 100644 --- a/be/src/vec/exprs/vexpr_context.h +++ b/be/src/vec/exprs/vexpr_context.h @@ -178,6 +178,8 @@ public: [[nodiscard]] const std::string& expr_name() const; [[nodiscard]] bool is_blockable() const; + double execute_cost() const; + VExprSPtr root() { return _root; } void set_root(const VExprSPtr& expr) { _root = expr; } void set_index_context(std::shared_ptr<IndexExecContext> index_context) { diff --git a/be/src/vec/exprs/vruntimefilter_wrapper.h b/be/src/vec/exprs/vruntimefilter_wrapper.h index 09bc8a815c7..a630d58d82e 100644 --- a/be/src/vec/exprs/vruntimefilter_wrapper.h +++ b/be/src/vec/exprs/vruntimefilter_wrapper.h @@ -63,6 +63,8 @@ public: const std::string& expr_name() const override; const VExprSPtrs& children() const override { return _impl->children(); } + double execute_cost() const override { return _impl->execute_cost(); } + Status execute_filter(VExprContext* context, const Block* block, uint8_t* __restrict result_filter_data, size_t rows, bool accept_null, bool* can_filter_all) const override; diff --git a/be/src/vec/functions/function.h b/be/src/vec/functions/function.h index 3c9c389aa8a..51daeff2168 100644 --- a/be/src/vec/functions/function.h +++ b/be/src/vec/functions/function.h @@ -167,6 +167,8 @@ public: virtual const DataTypes& get_argument_types() const = 0; virtual const DataTypePtr& get_return_type() const = 0; + virtual double execute_cost() const { return 1.0; } + /// Do preparations and return executable. /// sample_block should contain data types of arguments and values of constants, if relevant. virtual PreparedFunctionPtr prepare(FunctionContext* context, const Block& sample_block, diff --git a/be/src/vec/functions/functions_comparison.h b/be/src/vec/functions/functions_comparison.h index 2f5a5088af6..244f32f60e0 100644 --- a/be/src/vec/functions/functions_comparison.h +++ b/be/src/vec/functions/functions_comparison.h @@ -271,6 +271,8 @@ public: FunctionComparison() = default; + double execute_cost() const override { return 0.1; } + private: template <PrimitiveType PT> Status execute_num_type(Block& block, uint32_t result, const ColumnPtr& col_left_ptr, --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
