enhance: optimize term expr performance (#45491)

issue: https://github.com/milvus-io/milvus/issues/45641

---------

Signed-off-by: sunby <sunbingyi1992@gmail.com>
This commit is contained in:
Bingyi Sun 2025-11-21 11:01:05 +08:00 committed by GitHub
parent 3202847092
commit 275a5b9afc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -838,29 +838,36 @@ PhyTermFilterExpr::ExecVisitorImplForIndex() {
return nullptr; return nullptr;
} }
std::vector<IndexInnerType> vals; if (!arg_inited_) {
for (auto& val : expr_->vals_) { std::vector<IndexInnerType> vals;
if constexpr (std::is_same_v<T, double>) { for (auto& val : expr_->vals_) {
if (val.has_int64_val()) { if constexpr (std::is_same_v<T, double>) {
// only json field will cast int to double because other fields are casted in proxy if (val.has_int64_val()) {
vals.emplace_back(static_cast<double>(val.int64_val())); // only json field will cast int to double because other fields are casted in proxy
continue; vals.emplace_back(static_cast<double>(val.int64_val()));
continue;
}
}
// Generic overflow handling for all types
bool overflowed = false;
auto converted_val =
GetValueFromProtoWithOverflow<T>(val, overflowed);
if (!overflowed) {
vals.emplace_back(converted_val);
} }
} }
arg_set_ = std::make_shared<FlatVectorElement<IndexInnerType>>(vals);
// Generic overflow handling for all types arg_inited_ = true;
bool overflowed = false;
auto converted_val = GetValueFromProtoWithOverflow<T>(val, overflowed);
if (!overflowed) {
vals.emplace_back(converted_val);
}
} }
auto execute_sub_batch = [](Index* index_ptr, auto execute_sub_batch = [](Index* index_ptr,
const std::vector<IndexInnerType>& vals) { const std::vector<IndexInnerType>& vals) {
TermIndexFunc<T> func; TermIndexFunc<T> func;
return func(index_ptr, vals.size(), vals.data()); return func(index_ptr, vals.size(), vals.data());
}; };
auto res = ProcessIndexChunks<T>(execute_sub_batch, vals); auto args =
std::dynamic_pointer_cast<FlatVectorElement<IndexInnerType>>(arg_set_);
auto res = ProcessIndexChunks<T>(execute_sub_batch, args->values_);
AssertInfo(res->size() == real_batch_size, AssertInfo(res->size() == real_batch_size,
"internal error: expr processed rows {} not equal " "internal error: expr processed rows {} not equal "
"expect batch size {}", "expect batch size {}",