ClickHouse使用(七)

SummingMergeTree

适用于,多查询汇总结果,不关心明细数据的场景(Group By条件明确 而且不会随机改变)

正常思路

MergeTree存储数据,用group by 和 sum聚合函数查询汇总结果
(1)会造成存储空间的浪费,存储大量明细数据
(2)查询时的计算会有额外的计算开销
在MergeTree系列的存储引擎中,只有在SummingMergeTree 和 AggregatingMergeTree中会出现 primary key 和 order by 不同的情况

在MergeTree系列的存储引擎中,只有在SummingMergeTree 和 AggregatingMergeTree中会出现 primary key 和 order by 不同的情况

这是因为,聚合是根据order by 后的字段进行的,主键和聚合条件分离,为修改聚合条件留下空间
例如
order by (a,b,c,d) primary key a,按照 abcd分组,按照 a 过滤查询的场景

注意:
primary key 中的 字段 必须是 order by 的前缀,例如 order by (b,c) primary a 是错误的定义方式
这种强制约束是为了保证索引和数据顺序的一致性

修改排序字段只能减少字段,新增的字段只能是通过 alter add column 新增的字段

支持嵌套类型字段,使用时必须以Map结尾

例如:
create table summing_table_nested(
id String,
nestedMap Nested(
id uint32,
key uint32,
val uint64
),
create_time DateTime
)engine = SummingMergeTree()
partition by toYYYYMM(create_time)
order by id

默认情况 会以嵌套类型中第一个字段作为聚合条件Key
如数据
id nestMap.id nestMap.key netstMap.val create_time
A001 [1,1,2] [10,20,30] [40,50,60] 2021-11-22 22:00:00

汇总后
A001 [1,2] [30,30] [90,60] 2021-11-22 22:00:00

支持符合key 合并
嵌套类型中 以 Key,Id,Type结尾的字段 会自动和第一个字段组合符合Key

总结

(1)用Order by 排序键作为聚合的Key
(2)只有在合并分区时才出发汇总逻辑
(3)只汇总并同一个分区的数据
(4)不指定汇总字段默认,汇总字段为全部数值型字段
(5)数据汇总逻辑中,因为分区内数据已经按照Order by 排序,所以能够找到相邻且拥有相同聚合key的数据
(6)按照汇总key 将多行合并成一行,非汇总字段,取第一行被合并数据的值
(7)支持嵌套结构,名称必须以Map结尾,默认以第一个字段作为聚合key,除了第一个字段,任何以Key,Id,Type结尾的字段将和第一个字段组成复合Key

AggregatingMergeTree

数据立方体(按照聚合维度预计算)
定义实例:
create table agg_table(
id String,
city String,
code AggregateFunction(uniq,String),
value AggregateFuntion(sum,uint32),
create_time DateTime
)engine=AggregatingMergeTree()
partition by toYYYYMM(create_time)
order by (id,city)
primary key id

按照order by中定义好的维度进行预计算,并以2进制的形式存入到表中。是SummingMergeTree 的升级版
上面的定义等同于 Group by id,city code,value 为聚合字段等同于 uniq(code),sum(value)

使用方法

对于AggregateFunction类型的字段 数据的写入和查询都与寻常不同。
写入:*State

*表示定义表结构时的函数
例如:

code AggregateFunction(uniq,String),
value AggregateFuntion(sum,uint32),

uniq sum 对应的 uniqState sumState
插入数据:
insert into table agg_table
select ‘A001’,‘wuhan’,uniqState(‘code1’),sumState(toUInt32(100)),‘2021-02-22 00:00:00’

查询数据
select id,city,uniqMerge(code),sumMerge(value) from agg_table

主流用法

AggregateMergeTree 主要用于物化视图
聚合表(AggregateMergeTree ):明细表(MergeTree)

使用语法:
create materialized view agg_view
engin=aggregatingMergeTree()
partition by city
order by (di,city)
as select id,city,uniqState(code) as code,
sumState(value) as value
from agg_table_baisc
group by id,city

物化视图,针对特定场景使用 AggregateMergeTree,拥有更高的性能

新增面向底层表新增数据,数据会自动同步到物化视图,查询时可以直接查询物化视图

总结:
(1)使用Order by 排序键作为聚合数据的条件的key
(2)使用AggregateFunction字段属性定义聚合函数的类型以及聚合的字段
(3)只有在合并分区时候才会触发合并计算逻辑
(4)以数据分区为单位来聚合数据
(5)数据计算时,直接针对按照order by 排序的key进行计算
(6)局核实,同一个分区,相同key,会合并成一行,对于非主键和非AggregateFunction的字段,会使用第一行作为合并后的取值
(7)AggregateMergeTree使用二进制存储,写入数据时,需要调用State函数,查询数据时需要调用Merge函数,*标识定义时使用的聚合函数
(8)AggregateMergeTree 通常用作物化视图,和MergeTree配合使用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值