dbms: continue improvement [#CONV-2944].

This commit is contained in:
Alexey Milovidov 2013-02-09 00:12:04 +00:00
parent aeb201b726
commit 39429e780d
4 changed files with 14 additions and 7 deletions

View File

@ -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:

View File

@ -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;
}

View File

@ -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

View File

@ -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;