mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-21 01:00:48 +00:00
dbms: continue improvement [#CONV-2944].
This commit is contained in:
parent
aeb201b726
commit
39429e780d
@ -21,9 +21,6 @@ namespace DB
|
||||
class ColumnAggregateFunction : public ColumnVectorBase<AggregateDataPtr>
|
||||
{
|
||||
private:
|
||||
typedef SharedPtr<Arena> ArenaPtr;
|
||||
typedef std::vector<ArenaPtr> Arenas;
|
||||
|
||||
AggregateFunctionPtr func;
|
||||
Arenas arenas;
|
||||
public:
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
#include <string.h>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include <Poco/SharedPtr.h>
|
||||
#include <Yandex/optimization.h>
|
||||
|
||||
|
||||
@ -92,5 +94,8 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
typedef Poco::SharedPtr<Arena> ArenaPtr;
|
||||
typedef std::vector<ArenaPtr> Arenas;
|
||||
|
||||
|
||||
}
|
||||
|
@ -49,8 +49,9 @@ typedef HashMap<UInt128, std::pair<Row, AggregateDataPtr>, UInt128Hash, UInt128Z
|
||||
|
||||
struct AggregatedDataVariants
|
||||
{
|
||||
/// Пул для состояний агрегатных функций. Владение потом будет передано в ColumnAggregateFunction.
|
||||
SharedPtr<Arena> aggregates_pool;
|
||||
/// Пулы для состояний агрегатных функций. Владение потом будет передано в ColumnAggregateFunction.
|
||||
Arenas aggregates_pools;
|
||||
Arena * aggregates_pool; /// Последний пул, который используется для аллокации.
|
||||
|
||||
/// Наиболее общий вариант. Самый медленный. На данный момент, не используется.
|
||||
AggregatedData generic;
|
||||
@ -83,7 +84,7 @@ struct AggregatedDataVariants
|
||||
};
|
||||
Type type;
|
||||
|
||||
AggregatedDataVariants() : aggregates_pool(new Arena), without_key(NULL), type(EMPTY) {}
|
||||
AggregatedDataVariants() : aggregates_pools(1, new Arena), aggregates_pool(&*aggregates_pools.back()), without_key(NULL), type(EMPTY) {}
|
||||
bool empty() const { return type == EMPTY; }
|
||||
|
||||
size_t size() const
|
||||
|
@ -478,7 +478,9 @@ Block Aggregator::convertToBlock(AggregatedDataVariants & data_variants)
|
||||
{
|
||||
/// Столбец ColumnAggregateFunction захватывает разделяемое владение ареной с состояниями агрегатных функций.
|
||||
ColumnAggregateFunction & column_aggregate_func = static_cast<ColumnAggregateFunction &>(*res.getByPosition(i + keys_size).column);
|
||||
column_aggregate_func.addArena(data_variants.aggregates_pool);
|
||||
|
||||
for (size_t j = 0; j < data_variants.aggregates_pools.size(); ++j)
|
||||
column_aggregate_func.addArena(data_variants.aggregates_pools[j]);
|
||||
|
||||
aggregate_columns[i] = &column_aggregate_func.getData();
|
||||
aggregate_columns[i]->resize(rows);
|
||||
@ -590,6 +592,8 @@ AggregatedDataVariantsPtr Aggregator::merge(ManyAggregatedDataVariants & data_va
|
||||
rows += data_variants[i]->size();
|
||||
AggregatedDataVariants & current = *data_variants[i];
|
||||
|
||||
res->aggregates_pools.insert(res->aggregates_pools.end(), current.aggregates_pools.begin(), current.aggregates_pools.end());
|
||||
|
||||
if (current.empty())
|
||||
continue;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user