This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-4.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-4.0 by this push:
new 245be9f33cf branch-4.0: [Chore](profile) attach always true counter to
column predicate #58463 (#58597)
245be9f33cf is described below
commit 245be9f33cf7206dcf1916411ed7aae6440d904f
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Tue Dec 2 16:11:41 2025 +0800
branch-4.0: [Chore](profile) attach always true counter to column predicate
#58463 (#58597)
Cherry-picked from #58463
Co-authored-by: Pxl <[email protected]>
---
be/src/exec/olap_common.h | 29 ++++++++++++++--------
be/src/olap/bitmap_filter_predicate.h | 2 +-
be/src/olap/column_predicate.h | 21 +++++++++++++---
be/src/olap/comparison_predicate.h | 4 +--
be/src/olap/filter_olap_param.h | 8 +++++-
be/src/olap/rowset/segment_v2/segment_iterator.cpp | 8 ++----
be/src/olap/tablet_reader.cpp | 5 ++--
be/src/pipeline/exec/scan_operator.cpp | 16 +++++++++---
be/src/vec/exprs/vruntimefilter_wrapper.h | 3 +++
9 files changed, 66 insertions(+), 30 deletions(-)
diff --git a/be/src/exec/olap_common.h b/be/src/exec/olap_common.h
index 5d9f3741c51..8cb0311b326 100644
--- a/be/src/exec/olap_common.h
+++ b/be/src/exec/olap_common.h
@@ -210,7 +210,8 @@ public:
if (null_pred.condition_values.size() != 0) {
filters.emplace_back(_column_name, null_pred,
_runtime_filter_id,
_predicate_filtered_rows_counter,
- _predicate_input_rows_counter);
+ _predicate_input_rows_counter,
+ _predicate_always_true_rows_counter);
return;
}
@@ -223,9 +224,9 @@ public:
}
if (low.condition_values.size() != 0) {
- filters.emplace_back(_column_name, low, _runtime_filter_id,
- _predicate_filtered_rows_counter,
- _predicate_input_rows_counter);
+ filters.emplace_back(
+ _column_name, low, _runtime_filter_id,
_predicate_filtered_rows_counter,
+ _predicate_input_rows_counter,
_predicate_always_true_rows_counter);
}
TCondition high;
@@ -237,9 +238,9 @@ public:
}
if (high.condition_values.size() != 0) {
- filters.emplace_back(_column_name, high, _runtime_filter_id,
- _predicate_filtered_rows_counter,
- _predicate_input_rows_counter);
+ filters.emplace_back(
+ _column_name, high, _runtime_filter_id,
_predicate_filtered_rows_counter,
+ _predicate_input_rows_counter,
_predicate_always_true_rows_counter);
}
} else {
// 3. convert to is null and is not null filter condition
@@ -254,7 +255,8 @@ public:
if (null_pred.condition_values.size() != 0) {
filters.emplace_back(_column_name, null_pred,
_runtime_filter_id,
_predicate_filtered_rows_counter,
- _predicate_input_rows_counter);
+ _predicate_input_rows_counter,
+ _predicate_always_true_rows_counter);
}
}
}
@@ -271,7 +273,8 @@ public:
if (condition.condition_values.size() != 0) {
filters.emplace_back(_column_name, condition, _runtime_filter_id,
- _predicate_filtered_rows_counter,
_predicate_input_rows_counter);
+ _predicate_filtered_rows_counter,
_predicate_input_rows_counter,
+ _predicate_always_true_rows_counter);
}
}
@@ -311,7 +314,8 @@ public:
void attach_profile_counter(
int runtime_filter_id,
std::shared_ptr<RuntimeProfile::Counter>
predicate_filtered_rows_counter,
- std::shared_ptr<RuntimeProfile::Counter>
predicate_input_rows_counter) {
+ std::shared_ptr<RuntimeProfile::Counter>
predicate_input_rows_counter,
+ std::shared_ptr<RuntimeProfile::Counter>
predicate_always_true_rows_counter) {
DCHECK(predicate_filtered_rows_counter != nullptr);
DCHECK(predicate_input_rows_counter != nullptr);
@@ -323,6 +327,9 @@ public:
if (predicate_input_rows_counter != nullptr) {
_predicate_input_rows_counter = predicate_input_rows_counter;
}
+ if (predicate_always_true_rows_counter != nullptr) {
+ _predicate_always_true_rows_counter =
predicate_always_true_rows_counter;
+ }
}
int precision() const { return _precision; }
@@ -397,6 +404,8 @@ private:
std::make_shared<RuntimeProfile::Counter>(TUnit::UNIT, 0);
std::shared_ptr<RuntimeProfile::Counter> _predicate_input_rows_counter =
std::make_shared<RuntimeProfile::Counter>(TUnit::UNIT, 0);
+ std::shared_ptr<RuntimeProfile::Counter>
_predicate_always_true_rows_counter =
+ std::make_shared<RuntimeProfile::Counter>(TUnit::UNIT, 0);
};
template <>
const typename ColumnValueRange<TYPE_FLOAT>::CppType
ColumnValueRange<TYPE_FLOAT>::TYPE_MIN;
diff --git a/be/src/olap/bitmap_filter_predicate.h
b/be/src/olap/bitmap_filter_predicate.h
index 9bf44354a98..48b26c69359 100644
--- a/be/src/olap/bitmap_filter_predicate.h
+++ b/be/src/olap/bitmap_filter_predicate.h
@@ -111,7 +111,7 @@ uint16_t
BitmapFilterColumnPredicate<T>::_evaluate_inner(const vectorized::IColu
} else {
new_size = evaluate<false>(column, nullptr, sel, size);
}
- update_filter_info(size - new_size, size);
+ update_filter_info(size - new_size, size, 0);
return new_size;
}
} //namespace doris
diff --git a/be/src/olap/column_predicate.h b/be/src/olap/column_predicate.h
index 6923ff435e3..daee6f10a3e 100644
--- a/be/src/olap/column_predicate.h
+++ b/be/src/olap/column_predicate.h
@@ -189,6 +189,7 @@ public:
Defer defer([&] { try_reset_judge_selectivity(); });
if (always_true()) {
+ update_filter_info(0, 0, size);
return size;
}
@@ -196,7 +197,7 @@ public:
if (_can_ignore()) {
do_judge_selectivity(size - new_size, size);
}
- update_filter_info(size - new_size, size);
+ update_filter_info(size - new_size, size, 0);
return new_size;
}
virtual void evaluate_and(const vectorized::IColumn& column, const
uint16_t* sel, uint16_t size,
@@ -259,7 +260,8 @@ public:
void attach_profile_counter(
int filter_id, std::shared_ptr<RuntimeProfile::Counter>
predicate_filtered_rows_counter,
- std::shared_ptr<RuntimeProfile::Counter>
predicate_input_rows_counter) {
+ std::shared_ptr<RuntimeProfile::Counter>
predicate_input_rows_counter,
+ std::shared_ptr<RuntimeProfile::Counter>
predicate_always_true_rows_counter) {
_runtime_filter_id = filter_id;
DCHECK(predicate_filtered_rows_counter != nullptr);
DCHECK(predicate_input_rows_counter != nullptr);
@@ -270,12 +272,22 @@ public:
if (predicate_input_rows_counter != nullptr) {
_predicate_input_rows_counter = predicate_input_rows_counter;
}
+ if (predicate_always_true_rows_counter != nullptr) {
+ _predicate_always_true_rows_counter =
predicate_always_true_rows_counter;
+ }
}
/// TODO: Currently we only record statistics for runtime filters, in the
future we should record for all predicates
- void update_filter_info(int64_t filter_rows, int64_t input_rows) const {
+ void update_filter_info(int64_t filter_rows, int64_t input_rows,
+ int64_t always_true_rows) const {
+ if (_predicate_input_rows_counter == nullptr ||
+ _predicate_filtered_rows_counter == nullptr ||
+ _predicate_always_true_rows_counter == nullptr) {
+ throw Exception(INTERNAL_ERROR, "Predicate profile counters are
not initialized");
+ }
COUNTER_UPDATE(_predicate_input_rows_counter, input_rows);
COUNTER_UPDATE(_predicate_filtered_rows_counter, filter_rows);
+ COUNTER_UPDATE(_predicate_always_true_rows_counter, always_true_rows);
}
static std::string pred_type_string(PredicateType type) {
@@ -367,9 +379,10 @@ protected:
std::shared_ptr<RuntimeProfile::Counter> _predicate_filtered_rows_counter =
std::make_shared<RuntimeProfile::Counter>(TUnit::UNIT, 0);
-
std::shared_ptr<RuntimeProfile::Counter> _predicate_input_rows_counter =
std::make_shared<RuntimeProfile::Counter>(TUnit::UNIT, 0);
+ std::shared_ptr<RuntimeProfile::Counter>
_predicate_always_true_rows_counter =
+ std::make_shared<RuntimeProfile::Counter>(TUnit::UNIT, 0);
};
} //namespace doris
diff --git a/be/src/olap/comparison_predicate.h
b/be/src/olap/comparison_predicate.h
index 7df41bf11fe..ba5be11de60 100644
--- a/be/src/olap/comparison_predicate.h
+++ b/be/src/olap/comparison_predicate.h
@@ -284,8 +284,8 @@ public:
// so reference here is safe.
//
https://stackoverflow.com/questions/14688285/c-local-variable-destruction-order
Defer defer([&]() {
- update_filter_info(current_evaluated_rows - current_passed_rows,
- current_evaluated_rows);
+ update_filter_info(current_evaluated_rows - current_passed_rows,
current_evaluated_rows,
+ 0);
try_reset_judge_selectivity();
});
diff --git a/be/src/olap/filter_olap_param.h b/be/src/olap/filter_olap_param.h
index 272fee63fb5..0818c088523 100644
--- a/be/src/olap/filter_olap_param.h
+++ b/be/src/olap/filter_olap_param.h
@@ -25,7 +25,8 @@ template <typename T>
struct FilterOlapParam {
FilterOlapParam(std::string column_name, T filter, int runtime_filter_id,
std::shared_ptr<RuntimeProfile::Counter> filtered_counter,
- std::shared_ptr<RuntimeProfile::Counter> input_counter)
+ std::shared_ptr<RuntimeProfile::Counter> input_counter,
+ std::shared_ptr<RuntimeProfile::Counter>
always_true_counter)
: column_name(std::move(column_name)),
filter(std::move(filter)),
runtime_filter_id(runtime_filter_id) {
@@ -37,6 +38,9 @@ struct FilterOlapParam {
if (input_counter != nullptr) {
input_rows_counter = input_counter;
}
+ if (always_true_counter != nullptr) {
+ always_true_rows_counter = always_true_counter;
+ }
}
std::string column_name;
@@ -46,6 +50,8 @@ struct FilterOlapParam {
std::make_shared<RuntimeProfile::Counter>(TUnit::UNIT, 0);
std::shared_ptr<RuntimeProfile::Counter> input_rows_counter =
std::make_shared<RuntimeProfile::Counter>(TUnit::UNIT, 0);
+ std::shared_ptr<RuntimeProfile::Counter> always_true_rows_counter =
+ std::make_shared<RuntimeProfile::Counter>(TUnit::UNIT, 0);
};
} // namespace doris
diff --git a/be/src/olap/rowset/segment_v2/segment_iterator.cpp
b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
index 69e632b856c..d0301c7677f 100644
--- a/be/src/olap/rowset/segment_v2/segment_iterator.cpp
+++ b/be/src/olap/rowset/segment_v2/segment_iterator.cpp
@@ -2191,12 +2191,8 @@ uint16_t
SegmentIterator::_evaluate_vectorization_predicate(uint16_t* sel_rowid_
for (const auto& pred : _pre_eval_block_predicate) {
if (!pred->always_true()) {
all_pred_always_true = false;
- break;
- }
- }
- if (all_pred_always_true) {
- for (const auto& pred : _pre_eval_block_predicate) {
- DCHECK(pred->always_true());
+ } else {
+ pred->update_filter_info(0, 0, selected_size);
}
}
diff --git a/be/src/olap/tablet_reader.cpp b/be/src/olap/tablet_reader.cpp
index 27668d93fef..00eec28cf8a 100644
--- a/be/src/olap/tablet_reader.cpp
+++ b/be/src/olap/tablet_reader.cpp
@@ -523,7 +523,8 @@ Status TabletReader::_init_conditions_param(const
ReaderParams& read_params) {
for (const auto& param : params) {
ColumnPredicate* predicate =
_parse_to_predicate({param.column_name, param.filter});
predicate->attach_profile_counter(param.runtime_filter_id,
param.filtered_rows_counter,
- param.input_rows_counter);
+ param.input_rows_counter,
+ param.always_true_rows_counter);
predicates.emplace_back(predicate);
}
};
@@ -540,7 +541,7 @@ Status TabletReader::_init_conditions_param(const
ReaderParams& read_params) {
// record condition value into predicate_params in order to pushdown
segment_iterator,
// _gen_predicate_result_sign will build predicate result unique sign
with condition value
predicate->attach_profile_counter(param.runtime_filter_id,
param.filtered_rows_counter,
- param.input_rows_counter);
+ param.input_rows_counter,
param.always_true_rows_counter);
predicates.emplace_back(predicate);
}
parse_and_emplace_predicates(read_params.bloom_filters);
diff --git a/be/src/pipeline/exec/scan_operator.cpp
b/be/src/pipeline/exec/scan_operator.cpp
index 61e42c81503..05f127ba9df 100644
--- a/be/src/pipeline/exec/scan_operator.cpp
+++ b/be/src/pipeline/exec/scan_operator.cpp
@@ -321,7 +321,8 @@ Status ScanLocalState<Derived>::_normalize_predicate(
value_range.attach_profile_counter(
rf_expr->filter_id(),
rf_expr->predicate_filtered_rows_counter(),
-
rf_expr->predicate_input_rows_counter());
+
rf_expr->predicate_input_rows_counter(),
+
rf_expr->predicate_always_true_rows_counter());
}
}};
RETURN_IF_PUSH_DOWN(_normalize_in_and_eq_predicate(
@@ -388,7 +389,8 @@ Status
ScanLocalState<Derived>::_normalize_bloom_filter(vectorized::VExpr* expr,
_filter_predicates.bloom_filters.emplace_back(
slot->col_name(), expr->get_bloom_filter_func(),
rf_expr->filter_id(),
rf_expr->predicate_filtered_rows_counter(),
- rf_expr->predicate_input_rows_counter());
+ rf_expr->predicate_input_rows_counter(),
+ rf_expr->predicate_always_true_rows_counter());
*pdt = temp_pdt;
}
}
@@ -408,7 +410,8 @@ Status
ScanLocalState<Derived>::_normalize_bitmap_filter(vectorized::VExpr* expr
_filter_predicates.bitmap_filters.emplace_back(
slot->col_name(), expr->get_bitmap_filter_func(),
rf_expr->filter_id(),
rf_expr->predicate_filtered_rows_counter(),
- rf_expr->predicate_input_rows_counter());
+ rf_expr->predicate_input_rows_counter(),
+ rf_expr->predicate_always_true_rows_counter());
*pdt = temp_pdt;
}
}
@@ -620,16 +623,21 @@ Status
ScanLocalState<Derived>::_normalize_in_and_eq_predicate(vectorized::VExpr
int runtime_filter_id = -1;
std::shared_ptr<RuntimeProfile::Counter>
predicate_filtered_rows_counter = nullptr;
std::shared_ptr<RuntimeProfile::Counter>
predicate_input_rows_counter = nullptr;
+ std::shared_ptr<RuntimeProfile::Counter>
predicate_always_true_rows_counter =
+ nullptr;
if (expr_ctx->root()->is_rf_wrapper()) {
auto* rf_expr =
assert_cast<vectorized::VRuntimeFilterWrapper*>(expr_ctx->root().get());
runtime_filter_id = rf_expr->filter_id();
predicate_filtered_rows_counter =
rf_expr->predicate_filtered_rows_counter();
predicate_input_rows_counter =
rf_expr->predicate_input_rows_counter();
+ predicate_always_true_rows_counter =
+ rf_expr->predicate_always_true_rows_counter();
}
_filter_predicates.in_filters.emplace_back(
slot->col_name(), expr->get_set_func(),
runtime_filter_id,
- predicate_filtered_rows_counter,
predicate_input_rows_counter);
+ predicate_filtered_rows_counter,
predicate_input_rows_counter,
+ predicate_always_true_rows_counter);
*pdt = PushDownType::ACCEPTABLE;
return Status::OK();
}
diff --git a/be/src/vec/exprs/vruntimefilter_wrapper.h
b/be/src/vec/exprs/vruntimefilter_wrapper.h
index cdf30cff814..c68b773e883 100644
--- a/be/src/vec/exprs/vruntimefilter_wrapper.h
+++ b/be/src/vec/exprs/vruntimefilter_wrapper.h
@@ -116,6 +116,9 @@ public:
std::shared_ptr<RuntimeProfile::Counter> predicate_input_rows_counter()
const {
return _rf_input_rows;
}
+ std::shared_ptr<RuntimeProfile::Counter>
predicate_always_true_rows_counter() const {
+ return _always_true_filter_rows;
+ }
private:
void reset_judge_selectivity() const {
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]