| 12
 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搭配使用
 
 |