diff --git a/src/sql/engine/sort/ob_sort_vec_op_impl.h b/src/sql/engine/sort/ob_sort_vec_op_impl.h index 04572f8939..b1c2fc98b7 100644 --- a/src/sql/engine/sort/ob_sort_vec_op_impl.h +++ b/src/sql/engine/sort/ob_sort_vec_op_impl.h @@ -224,8 +224,11 @@ protected: void set_blk_holder(ObTempRowStore::BlockHolder *blk_holder); // for topn sort int add_heap_sort_row(const Store_Row *&store_row); + // load data to comp_ + int load_data_to_comp(const ObBatchRows &input_brs); int add_heap_sort_batch(const ObBatchRows &input_brs, const int64_t start_pos /* 0 */, - int64_t *append_row_count = nullptr); + int64_t *append_row_count = nullptr, + bool need_load_data = true); int add_heap_sort_batch(const ObBatchRows &input_brs, const uint16_t selector[], const int64_t size); int adjust_topn_heap(const Store_Row *&store_row); diff --git a/src/sql/engine/sort/ob_sort_vec_op_impl.ipp b/src/sql/engine/sort/ob_sort_vec_op_impl.ipp index 50fbf2f0fd..6ce46652ed 100644 --- a/src/sql/engine/sort/ob_sort_vec_op_impl.ipp +++ b/src/sql/engine/sort/ob_sort_vec_op_impl.ipp @@ -353,11 +353,13 @@ int ObSortVecOpImpl::add_batch(const ObBatchRows SQL_ENG_LOG(WARN, "failed to do topn dump", K(ret)); } } + bool need_load_data = true; if (OB_SUCC(ret)) { const ObBatchRows *input_brs_ptr = nullptr; if (is_topn_sort() && OB_NOT_NULL(topn_filter_) && OB_LIKELY(!topn_filter_->is_by_pass())) { - if (OB_FAIL(batch_eval_vector(all_exprs_, input_brs))) { - SQL_ENG_LOG(WARN, "failed to eval vector", K(ret)); + need_load_data = false; + if (OB_FAIL(load_data_to_comp(input_brs))) { + SQL_ENG_LOG(WARN, "failed to load data", K(ret)); } else if (OB_FAIL(topn_filter_->filter(all_exprs_, *eval_ctx_, start_pos, input_brs))) { SQL_ENG_LOG(WARN, "failed to do topn filter", K(ret)); @@ -369,7 +371,8 @@ int ObSortVecOpImpl::add_batch(const ObBatchRows } if (OB_SUCC(ret)) { if (use_heap_sort_) { - ret = add_heap_sort_batch(*input_brs_ptr, start_pos, append_row_count); + ret = add_heap_sort_batch(*input_brs_ptr, start_pos, append_row_count, + need_load_data); } else { ret = add_quick_sort_batch(*input_brs_ptr, start_pos, append_row_count); } @@ -935,9 +938,24 @@ int ObSortVecOpImpl::batch_eval_vector( return ret; } +template +int ObSortVecOpImpl::load_data_to_comp(const ObBatchRows &input_brs) +{ + int ret = OB_SUCCESS; + if (OB_FAIL(batch_eval_vector(all_exprs_, input_brs))) { + SQL_ENG_LOG(WARN, "failed to eval vector", K(ret)); + } else if (OB_FAIL(sort_exprs_getter_.fetch_payload(input_brs))) { + SQL_ENG_LOG(WARN, "failed to batch fetch sort key payload", K(ret)); + } else if(FALSE_IT(comp_.set_sort_key_col_result_list( + sort_exprs_getter_.get_sk_col_result_list()))) { + } + return ret; +} + template int ObSortVecOpImpl::add_heap_sort_batch( - const ObBatchRows &input_brs, const int64_t start_pos /* 0 */, int64_t *append_row_count) + const ObBatchRows &input_brs, const int64_t start_pos /* 0 */, int64_t *append_row_count, + bool need_load_data) { int ret = OB_SUCCESS; int64_t row_count = 0; @@ -946,12 +964,8 @@ int ObSortVecOpImpl::add_heap_sort_batch( batch_info_guard.set_batch_size(input_brs.size_); if (OB_FAIL(update_max_available_mem_size_periodically())) { SQL_ENG_LOG(WARN, "failed to update max available mem size periodically", K(ret)); - } else if (OB_FAIL(batch_eval_vector(all_exprs_, input_brs))) { - SQL_ENG_LOG(WARN, "failed to eval vector", K(ret)); - } else if (OB_FAIL(sort_exprs_getter_.fetch_payload(input_brs))) { - SQL_ENG_LOG(WARN, "failed to batch fetch sort key payload", K(ret)); - } else if (FALSE_IT(comp_.set_sort_key_col_result_list( - sort_exprs_getter_.get_sk_col_result_list()))) { + } else if (need_load_data && OB_FAIL(load_data_to_comp(input_brs))) { + SQL_ENG_LOG(WARN, "failed to load data", K(ret)); } else { for (int64_t i = start_pos; OB_SUCC(ret) && i < input_brs.size_; i++) { if (input_brs.skip_->exist(i)) {