From 0b379de602c909ff9152609fb85ed8f9f58ded25 Mon Sep 17 00:00:00 2001 From: zhangstar333 <87313068+zhangstar333@users.noreply.github.com> Date: Wed, 19 Apr 2023 09:10:51 +0800 Subject: [PATCH] [refactor](scan) optimize the agg function of count(1) (#18739) --- be/src/vec/columns/column_array.cpp | 6 ++++++ be/src/vec/columns/column_array.h | 1 + be/src/vec/columns/column_map.cpp | 6 ++++++ be/src/vec/columns/column_map.h | 1 + be/src/vec/columns/column_struct.cpp | 8 ++++++++ be/src/vec/columns/column_struct.h | 1 + .../org/apache/doris/planner/SingleNodePlanner.java | 10 ++++++---- 7 files changed, 29 insertions(+), 4 deletions(-) diff --git a/be/src/vec/columns/column_array.cpp b/be/src/vec/columns/column_array.cpp index 79b1aa7914..8908800736 100644 --- a/be/src/vec/columns/column_array.cpp +++ b/be/src/vec/columns/column_array.cpp @@ -301,6 +301,12 @@ void ColumnArray::reserve(size_t n) { n); /// The average size of arrays is not taken into account here. Or it is considered to be no more than 1. } +//please check you real need size in data column, because it's maybe need greater size when data is string column +void ColumnArray::resize(size_t n) { + get_offsets().resize(n); + get_data().resize(n); +} + size_t ColumnArray::byte_size() const { return get_data().byte_size() + get_offsets().size() * sizeof(get_offsets()[0]); } diff --git a/be/src/vec/columns/column_array.h b/be/src/vec/columns/column_array.h index e015fdb307..2d8c9fd5d1 100644 --- a/be/src/vec/columns/column_array.h +++ b/be/src/vec/columns/column_array.h @@ -106,6 +106,7 @@ public: TypeIndex get_data_type() const override { return TypeIndex::Array; } MutableColumnPtr clone_resized(size_t size) const override; size_t size() const override; + void resize(size_t n) override; Field operator[](size_t n) const override; void get(size_t n, Field& res) const override; StringRef get_data_at(size_t n) const override; diff --git a/be/src/vec/columns/column_map.cpp b/be/src/vec/columns/column_map.cpp index 13a84dd9f1..ff3fc808fb 100644 --- a/be/src/vec/columns/column_map.cpp +++ b/be/src/vec/columns/column_map.cpp @@ -359,6 +359,12 @@ void ColumnMap::reserve(size_t n) { values_column->reserve(n); } +void ColumnMap::resize(size_t n) { + get_offsets().resize(n); + keys_column->resize(n); + values_column->resize(n); +} + size_t ColumnMap::byte_size() const { return keys_column->byte_size() + values_column->byte_size() + offsets_column->byte_size(); ; diff --git a/be/src/vec/columns/column_map.h b/be/src/vec/columns/column_map.h index b1fe8a76f5..668240ec30 100644 --- a/be/src/vec/columns/column_map.h +++ b/be/src/vec/columns/column_map.h @@ -137,6 +137,7 @@ public: size_t size() const override { return get_offsets().size(); } void reserve(size_t n) override; + void resize(size_t n) override; size_t byte_size() const override; size_t allocated_bytes() const override; void protect() override; diff --git a/be/src/vec/columns/column_struct.cpp b/be/src/vec/columns/column_struct.cpp index f9f25db351..f477c20e57 100644 --- a/be/src/vec/columns/column_struct.cpp +++ b/be/src/vec/columns/column_struct.cpp @@ -294,6 +294,14 @@ void ColumnStruct::reserve(size_t n) { } } +//please check you real need size in data column, When it mixes various data types, eg: string column with int column +void ColumnStruct::resize(size_t n) { + const size_t tuple_size = columns.size(); + for (size_t i = 0; i < tuple_size; ++i) { + get_column(i).resize(n); + } +} + size_t ColumnStruct::byte_size() const { size_t res = 0; for (const auto& column : columns) { diff --git a/be/src/vec/columns/column_struct.h b/be/src/vec/columns/column_struct.h index d43d8801f6..88a95767f6 100644 --- a/be/src/vec/columns/column_struct.h +++ b/be/src/vec/columns/column_struct.h @@ -121,6 +121,7 @@ public: } void get_extremes(Field& min, Field& max) const override; void reserve(size_t n) override; + void resize(size_t n) override; size_t byte_size() const override; size_t allocated_bytes() const override; void protect() override; diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java index 4f0549449e..55df5b6f54 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/SingleNodePlanner.java @@ -458,8 +458,11 @@ public class SingleNodePlanner { break; } } else { - aggExprValidate = false; - break; + // want to support the agg of count(const value) in dup table + aggExprValidate = (aggOp == TPushAggOp.COUNT && child.isConstant() && !child.isNullable()); + if (!aggExprValidate) { + break; + } } } else { returnColumns.add(((SlotRef) aggExpr.getChild(0)).getDesc().getColumn()); @@ -490,8 +493,7 @@ public class SingleNodePlanner { break; } - if (colType.isCharFamily() && aggOp != TPushAggOp.COUNT - && col.getType().getLength() > 512) { + if (colType.isCharFamily() && col.getType().getLength() > 512) { returnColumnValidate = false; break; }