SimpleAggregateFunction 数据类型存储聚合函数的中间状态,
但不像 AggregateFunction
类型那样存储其完整状态。
这种优化可应用于满足以下性质的函数:
对行集 S1 UNION ALL S2 应用函数 f 的结果,可以通过分别对行集的各个部分应用 f,然后再
对这些结果应用 f 得到:f(S1 UNION ALL S2) = f(f(S1) UNION ALL f(S2))。
这一性质保证了,部分聚合结果就足以计算
合并后的结果,因此我们无需存储和处理任何额外数据。例如,
min 或 max 函数的结果无需额外步骤即可从中间结果
计算出最终结果,而 avg 函数则需要跟踪总和与计数,
然后在合并中间状态的最终 Merge 步骤中将二者相除以得到
平均值。
聚合函数值通常通过调用聚合函数,并在函数名后附加
-SimpleState 组合器来生成。
SimpleAggregateFunction(aggregate_function_name, types_of_arguments...)
参数
aggregate_function_name - 聚合函数名称。
Type - 聚合函数参数的类型。
支持以下聚合函数:
SimpleAggregateFunction(func, Type) 的值具有相同的 Type,
因此不同于 AggregateFunction 类型,无需应用
-Merge/-State 组合器。对于相同的聚合函数,SimpleAggregateFunction 类型的性能优于 AggregateFunction 类型。
CREATE TABLE simple (id UInt64, val SimpleAggregateFunction(sum, Double)) ENGINE=AggregatingMergeTree ORDER BY id;