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)还有就是一般我们都是使用的是日期作为分区键,同一分区内有序,不同分区不能保证有序。