This is an automated email from the ASF dual-hosted git repository.
zhangstar333 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new d1ab540e27b [opt](column) Optimize the execution of the
append_data_by_selector function in ColumnNullable (#49798)
d1ab540e27b is described below
commit d1ab540e27b9823d67928f551c27c1b258089d9e
Author: Mryange <[email protected]>
AuthorDate: Fri Apr 11 10:11:17 2025 +0800
[opt](column) Optimize the execution of the append_data_by_selector
function in ColumnNullable (#49798)
### What problem does this PR solve?
```
CPU Caches:
L1 Data 32 KiB (x48)
L1 Instruction 32 KiB (x48)
L2 Unified 1024 KiB (x48)
L3 Unified 36608 KiB (x2)
Load Average: 251.11, 123.23, 74.40
---------------------------------------------------------
Benchmark Time CPU Iterations
---------------------------------------------------------
Example_origin 11730 ns 11730 ns 59580
Example_opt 3984 ns 3984 ns 173992
```
---
be/src/vec/columns/column_nullable.cpp | 15 +++++++++++++++
be/src/vec/columns/column_nullable.h | 6 ++++++
be/test/vec/columns/column_nullable_test.cpp | 20 ++++++++++++++++++++
3 files changed, 41 insertions(+)
diff --git a/be/src/vec/columns/column_nullable.cpp
b/be/src/vec/columns/column_nullable.cpp
index db28e07a4c8..9acc839a1e9 100644
--- a/be/src/vec/columns/column_nullable.cpp
+++ b/be/src/vec/columns/column_nullable.cpp
@@ -327,6 +327,21 @@ void ColumnNullable::insert_from(const IColumn& src,
size_t n) {
get_null_map_data().push_back(is_null);
}
+void ColumnNullable::append_data_by_selector(IColumn::MutablePtr& res,
+ const IColumn::Selector&
selector) const {
+ append_data_by_selector(res, selector, 0, selector.size());
+}
+
+void ColumnNullable::append_data_by_selector(IColumn::MutablePtr& res,
+ const IColumn::Selector&
selector, size_t begin,
+ size_t end) const {
+ auto& res_column = assert_cast<ColumnNullable&>(*res);
+ auto res_nested_column = res_column.get_nested_column_ptr();
+ this->get_nested_column().append_data_by_selector(res_nested_column,
selector, begin, end);
+ auto res_null_map = res_column.get_null_map_column_ptr();
+ this->get_null_map_column().append_data_by_selector(res_null_map,
selector, begin, end);
+}
+
void ColumnNullable::insert_from_not_nullable(const IColumn& src, size_t n) {
get_nested_column().insert_from(src, n);
_push_false_to_nullmap(1);
diff --git a/be/src/vec/columns/column_nullable.h
b/be/src/vec/columns/column_nullable.h
index 58599a51f22..c35873c04ca 100644
--- a/be/src/vec/columns/column_nullable.h
+++ b/be/src/vec/columns/column_nullable.h
@@ -200,6 +200,12 @@ public:
void insert_many_from(const IColumn& src, size_t position, size_t length)
override;
+ void append_data_by_selector(IColumn::MutablePtr& res,
+ const IColumn::Selector& selector) const
override;
+
+ void append_data_by_selector(IColumn::MutablePtr& res, const
IColumn::Selector& selector,
+ size_t begin, size_t end) const override;
+
template <typename ColumnType>
void insert_from_with_type(const IColumn& src, size_t n) {
const auto& src_concrete = assert_cast<const ColumnNullable&>(src);
diff --git a/be/test/vec/columns/column_nullable_test.cpp
b/be/test/vec/columns/column_nullable_test.cpp
index 3cd269d51da..70fcd101774 100644
--- a/be/test/vec/columns/column_nullable_test.cpp
+++ b/be/test/vec/columns/column_nullable_test.cpp
@@ -24,11 +24,13 @@
#include "column_nullable_test.h"
#include "common/status.h"
#include "runtime/define_primitive_type.h"
+#include "testutil/column_helper.h"
#include "vec/columns/columns_number.h"
#include "vec/columns/predicate_column.h"
#include "vec/core/field.h"
#include "vec/core/types.h"
#include "vec/data_types/data_type.h"
+#include "vec/data_types/data_type_number.h"
namespace doris::vectorized {
@@ -109,4 +111,22 @@ TEST(ColumnNullableTest, PredicateTest) {
// filter_by_selector must announce to update has_null to make below right.
EXPECT_TRUE(null_dst->has_null());
}
+
+TEST(ColumnNullableTest, append_data_by_selector) {
+ auto srt_column = ColumnHelper::create_nullable_column<DataTypeInt64>(
+ {1, 2, 3, 4, 5, 6, 7, 8, 9, 10},
+ {true, false, true, false, false, false, true, false, false,
false});
+
+ IColumn::Selector selector = {0, 2, 4, 6, 8};
+
+ IColumn::MutablePtr dst_column =
+ ColumnNullable::create(ColumnInt64::create(),
ColumnUInt8::create());
+
+ srt_column->append_data_by_selector(dst_column, selector);
+
+ auto expected_column = ColumnHelper::create_nullable_column<DataTypeInt64>(
+ {1, 3, 5, 7, 9}, {true, true, false, true, false});
+
+ EXPECT_TRUE(ColumnHelper::column_equal(std::move(dst_column),
expected_column));
+}
} // namespace doris::vectorized
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]