clickhouse分区规则与优化
一、分区规则
1.使用类型
1)不指定分区键
如果建表时不指定分区键,则数据默认不分区,所有数据写到一个默认分区all里面。
2)使用整型
如果分区键取值属于整型且无法转换为日期类型YYYVYMMDD格式,则直接按照该整型的字符形式输出作为分区ID的取值。
3)使用日期类型
如果分区键取值属于日期类型,或者是能够转换为YYYYMMDD日期格式的整型,则按照分区表达式逻辑格式化后作为分区ID的取值。
4)使用其它类型
如果分区键取值既不属于整型,也不屋于日期类型,例如String、Float等,则通过128位Hash算法取其Hash值作为分区ID的取值。
2.分区目录命名规则
20210524_1_1_0
partition_id_ min_block_number_ max_block _number_ level
1)partition_id:20210524,分区生成规则见上;
2)min_block_number:1,最小块编号,MergeTree引|擎从1开始计数,每次+1;
3)max block_number:1,最大块编号,新插入的数据,最小与最大编号一致;
4)level:0,这个可以理解为合并的次数,新插入的数据都是0,每合并1次+1。
3.分区目录合并过程
如图:
4.分区设计
分区选择考虑merge (写入放大)、查询(slelect part数量)、启动等方面考虑。在实际生产中选择时间作为分区键,根据表数据的大小按天或者按周进行了分区。
如图:
5.分区优化
1)分区粒度根据业务特点决定,不宜过粗或过细。一般选择按天分区,也可以指定为Tuple(),以单表一亿数据为例,分区大小控制在10-30个为最佳。
2)那些有相同分区表达式值的数据片段才会合并。这意味着 你不应该用太精细的分区方案(超过一千个分区)。否则,会因为文件系统中的文件数量过多和需要打开的文件描述符过多,导致 SELECT 查询效率不佳。
3)还有就是一般我们都是使用的是日期作为分区键,同一分区内有序,不同分区不能保证有序。