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]

Reply via email to