本篇文章主要聊一下CLK中的表级别优化操作
- 时间字段的类型
CLK与HIVE两者虽然都是用天来进行分区规则,但是不同的点就是,HIVE的日期字段是STRING,CLK的官方建议是时间戳字段直接使用DATATIME或者是Long类型的(INT32)
如果使用STRING也不是不可以,CLK底层也会将STRING给转化成LONG(INT32)去存储,或多或少会影响点性能
create table t_type2(
id UInt32,
sku_id String,
total_amount Decimal(16,2) ,
create_time Int32
)
engine =ReplacingMergeTree(create_time)
partition by toYYYYMMDD(toDate(create_time))
primary key (id) order by (id, sku_id);
create table t_type2(
id UInt32,
sku_id String,
total_amount Decimal(16,2) ,
create_time DataTime
)
engine =ReplacingMergeTree(create_time)
partition by toYYYYMMDD(create_time)
primary key (id) order by (id, sku_id);
- 空值
空值无论是在HIVE还是CLK中都是应该避免的,在CLK中,空值列无法被索引,并且空值还会在CLK的底层多一个小文件出来,除非特殊情况,空值都应该指定一个业务上不使用的默认值来避免这种情况的出现
官网说明:https://clickhouse.tech/docs/zh/sql-reference/data-types/nullable/
3 . 分区/索引
分区一般按天进行分区
CLK中必须指定索引列,索引列就是排序列,也就是ORDER BY中的字段
组合索引遵循查询频率大的在前的原则,基数特别大的(查询很频繁,数据量还很大)不建议作为索引列
4 . TTL
合理的使用针对表的TTL功能,可以很大程度上的减少磁盘存储空间
5 . 写入/删除操作
尽量避免小批量的删除和插入,会产生过多的小分区文件
不要一次写入过多个分区,最好针对一个分区进行操作