This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-2.1 by this push:
new e7ee762e57a [Enchancement](sort) do a little optimization for full
sort (#55317)
e7ee762e57a is described below
commit e7ee762e57a1aac15d30ad572adf0fd09b041622
Author: shee <[email protected]>
AuthorDate: Wed Aug 27 18:41:37 2025 +0800
[Enchancement](sort) do a little optimization for full sort (#55317)
### What problem does this PR solve?
Issue Number: close #xxx
Related PR: #xxx
Problem Summary:
### Release note
None
### Check List (For Author)
- Test <!-- At least one of them must be included. -->
- [ ] Regression test
- [ ] Unit Test
- [ ] Manual test (add detailed scripts or steps below)
- [ ] No need to test or manual test. Explain why:
- [ ] This is a refactor/code format and no logic has been changed.
- [ ] Previous test can cover this change.
- [ ] No code files have been changed.
- [ ] Other reason <!-- Add your reason? -->
- Behavior changed:
- [ ] No.
- [ ] Yes. <!-- Explain the behavior change -->
- Does this need documentation?
- [ ] No.
- [ ] Yes. <!-- Add document PR link here. eg:
https://github.com/apache/doris-website/pull/1214 -->
### Check List (For Reviewer who merge this PR)
- [ ] Confirm the release note
- [ ] Confirm test cases
- [ ] Confirm document
- [ ] Add branch pick label <!-- Add branch pick label that this PR
should merge into -->
---------
Co-authored-by: garenshi <[email protected]>
Co-authored-by: garenshi <[email protected]>
---
be/src/vec/common/sort/sorter.cpp | 13 +++++++++----
be/src/vec/core/sort_cursor.h | 20 +++++++++++++-------
2 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/be/src/vec/common/sort/sorter.cpp
b/be/src/vec/common/sort/sorter.cpp
index 72bf35f3cba..5c94b58ea66 100644
--- a/be/src/vec/common/sort/sorter.cpp
+++ b/be/src/vec/common/sort/sorter.cpp
@@ -126,7 +126,7 @@ Status MergeSorterState::_merge_sort_read_impl(int
batch_size, doris::vectorized
if (offset_ == 0) {
for (size_t i = 0; i < num_columns; ++i)
-
merged_columns[i]->insert_from(*current->block->get_columns()[i], current->pos);
+ merged_columns[i]->insert_from(*current->columns[i],
current->pos);
++merged_rows;
} else {
offset_--;
@@ -226,9 +226,14 @@ Status FullSorter::append_block(Block* block) {
DCHECK(data[i].type->equals(*(arrival_data[i].type)))
<< " type1: " << data[i].type->get_name()
<< " type2: " << arrival_data[i].type->get_name() << " i:
" << i;
- //TODO: to eliminate unnecessary expansion, we need a
`insert_range_from_const` for every column type.
- data[i].column->assume_mutable()->insert_range_from(
-
*arrival_data[i].column->convert_to_full_column_if_const(), 0, sz);
+ if (is_column_const(*arrival_data[i].column)) {
+ data[i].column->assume_mutable()->insert_many_from(
+ assert_cast<const
ColumnConst*>(arrival_data[i].column.get())
+ ->get_data_column(),
+ 0, sz);
+ } else {
+
data[i].column->assume_mutable()->insert_range_from(*arrival_data[i].column, 0,
sz);
+ }
}
block->clear_column_data();
}
diff --git a/be/src/vec/core/sort_cursor.h b/be/src/vec/core/sort_cursor.h
index 8b627f50af7..31721d663fd 100644
--- a/be/src/vec/core/sort_cursor.h
+++ b/be/src/vec/core/sort_cursor.h
@@ -123,6 +123,7 @@ struct MergeSortCursorImpl {
ENABLE_FACTORY_CREATOR(MergeSortCursorImpl);
std::shared_ptr<Block> block;
ColumnRawPtrs sort_columns;
+ ColumnRawPtrs columns;
SortDescription desc;
size_t sort_columns_size = 0;
size_t pos = 0;
@@ -132,25 +133,30 @@ struct MergeSortCursorImpl {
virtual ~MergeSortCursorImpl() = default;
MergeSortCursorImpl(std::shared_ptr<Block> block_, const SortDescription&
desc_)
- : block(block_), desc(desc_), sort_columns_size(desc.size()) {
+ : block(std::move(block_)), desc(std::move(desc_)),
sort_columns_size(desc.size()) {
reset();
}
MergeSortCursorImpl(const SortDescription& desc_)
- : block(Block::create_shared()), desc(desc_),
sort_columns_size(desc.size()) {}
+ : block(Block::create_shared()),
+ desc(std::move(desc_)),
+ sort_columns_size(desc.size()) {}
bool empty() const { return rows == 0; }
/// Set the cursor to the beginning of the new block.
void reset() {
sort_columns.clear();
-
- auto columns = block->get_columns_and_convert();
- for (size_t j = 0, size = desc.size(); j < size; ++j) {
- auto& column_desc = desc[j];
+ columns.clear();
+ auto tmp_columns = block->get_columns_and_convert();
+ columns.reserve(tmp_columns.size());
+ for (auto col : tmp_columns) {
+ columns.push_back(col.get());
+ }
+ for (auto& column_desc : desc) {
size_t column_number = !column_desc.column_name.empty()
?
block->get_position_by_name(column_desc.column_name)
: column_desc.column_number;
- sort_columns.push_back(columns[column_number].get());
+ sort_columns.push_back(columns[column_number]);
}
pos = 0;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]