This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch tpch500
in repository https://gitbox.apache.org/repos/asf/doris.git

commit 99ff64802ed41c1fe25bd3c3e7a5cc0fcc07d9e0
Author: morningman <[email protected]>
AuthorDate: Fri Dec 22 21:29:41 2023 +0800

    [tmp] [opt](performance) Opt the null column query performance #28809
---
 be/src/exec/exec_node.cpp                                |  5 +++--
 be/src/vec/aggregate_functions/aggregate_function_null.h | 16 ++++++++++++----
 be/src/vec/columns/column_nullable.h                     |  2 ++
 3 files changed, 17 insertions(+), 6 deletions(-)

diff --git a/be/src/exec/exec_node.cpp b/be/src/exec/exec_node.cpp
index 4681218dcae..b7e891fe29e 100644
--- a/be/src/exec/exec_node.cpp
+++ b/be/src/exec/exec_node.cpp
@@ -557,10 +557,11 @@ Status ExecNode::do_projections(vectorized::Block* 
origin_block, vectorized::Blo
                 reinterpret_cast<ColumnNullable*>(mutable_columns[i].get())
                         ->insert_range_from_not_nullable(*column_ptr, 0, rows);
             } else {
-                mutable_columns[i]->insert_range_from(*column_ptr, 0, rows);
+                std::swap(output_block->get_by_position(i).column,
+                          
origin_block->get_by_position(result_column_id).column);
             }
         }
-        DCHECK(mutable_block.rows() == rows);
+        DCHECK(output_block->rows() == rows);
     }
 
     return Status::OK();
diff --git a/be/src/vec/aggregate_functions/aggregate_function_null.h 
b/be/src/vec/aggregate_functions/aggregate_function_null.h
index becb06f7cfc..026404b88c7 100644
--- a/be/src/vec/aggregate_functions/aggregate_function_null.h
+++ b/be/src/vec/aggregate_functions/aggregate_function_null.h
@@ -213,15 +213,23 @@ public:
     void add_batch(size_t batch_size, AggregateDataPtr* places, size_t 
place_offset,
                    const IColumn** columns, Arena* arena, bool agg_many) const 
override {
         const ColumnNullable* column = assert_cast<const 
ColumnNullable*>(columns[0]);
-        // The overhead introduced is negligible here, just an extra memory 
read from NullMap
-        const auto* __restrict null_map_data = 
column->get_null_map_data().data();
         const IColumn* nested_column = &column->get_nested_column();
-        for (int i = 0; i < batch_size; ++i) {
-            if (!null_map_data[i]) {
+        if (column->can_skip_null_check()) {
+            for (int i = 0; i < batch_size; ++i) {
                 AggregateDataPtr __restrict place = places[i] + place_offset;
                 this->set_flag(place);
                 this->nested_function->add(this->nested_place(place), 
&nested_column, i, arena);
             }
+        } else {
+            // The overhead introduced is negligible here, just an extra 
memory read from NullMap
+            const auto* __restrict null_map_data = 
column->get_null_map_data().data();
+            for (int i = 0; i < batch_size; ++i) {
+                if (!null_map_data[i]) {
+                    AggregateDataPtr __restrict place = places[i] + 
place_offset;
+                    this->set_flag(place);
+                    this->nested_function->add(this->nested_place(place), 
&nested_column, i, arena);
+                }
+            }
         }
     }
 
diff --git a/be/src/vec/columns/column_nullable.h 
b/be/src/vec/columns/column_nullable.h
index 10b0951ab8b..ff2e1dbfc22 100644
--- a/be/src/vec/columns/column_nullable.h
+++ b/be/src/vec/columns/column_nullable.h
@@ -325,6 +325,8 @@ public:
     /// Check that size of null map equals to size of nested column.
     void check_consistency() const;
 
+    bool can_skip_null_check() const { return !_need_update_has_null && 
!_has_null; }
+
     bool has_null() const override {
         if (UNLIKELY(_need_update_has_null)) {
             const_cast<ColumnNullable*>(this)->_update_has_null();


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to