1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| 通过以空间换时间的方法提升查询性能,将需要聚合的数据预先计算出来,并将结果保存起来 eg: create table agg_table( id string, city string, code AggregateFunction(uniq,string), value AggregateFunction(sum,UInt32), create_time DateTime ) engine=AggregatingMergeTree() order by (id,city) primary key id
AggregateFunction 是clickhouse提供的一种特殊的数据类型,它能够以二进制的形式存储中间状态结果;在写入数据时,需要调用*State函数;而在查询数据时,则需要调用相应的*Merge函数; *表示定义时使用的聚合函数 比如uniq和sum
写入数据 eg: insert into table agg_table select 'a000','dan',uniqState('code1'),sumState(toUInt32(100)),'2021-06-05 10:00:00'
查询数据 eg: select id,city,uniqMerge(code),summerge(value) from agg_table group by id,city
更为常见的应用方式是结合物化视图使用,将它作为物化视图的表引擎
首先建立明细数据表,俗称的底表 eg: create table agg_table_basic( id string, city string, code string, value UInt32 )engine=MergeTree() partition by city order by (id,city)
通常会使用MergeTree作为底表,用于存储全量的明细数据,并以此对外提供实时查询 eg: create metarialized view agg_view engine = AggregatingMergeTree() partition by city order by (id,city) as select id,city,uniqState(code) as code, sumState(value) as value from agg_table_basic group by id,city
处理逻辑: 1.用order by排序键作为聚合数据的条件key 2.使用AggregateFunction字段类型定义聚合函数的类型以及聚合字段 3.只有在合并分区的时候才会触发聚合计算的逻辑 4.以数据分区为单位来聚合数据,当分区合并时,同一数据分区内聚合key相同的数据会被合并计算,而不同分区之间的数据则不会被计算 5.在进行数据计算时,因为分区内的数据已经基于order by排序,所以能够找到那些相邻且拥有相同聚合key的数据 6.在聚合数据时,同一分区内,相同聚合key的多行数据会合并成一行;对于那些非主键、非AggregateFunction类型字段,则会使用第一行数据的取值 7.AggregateFunction类型的字段使用二进制存储,在写入数据时,需要调用*State函数;而在查询数据时,则需要调用相应的*Merge函数;其中*表示定义时使用的聚合函数 8.AggregatingMergeTree通常作为物化视图的表引擎,与普通MergeTree搭配使用
|