了解ClickHouse中的part和partition
part包含了一张表中部分行的数据。一个part在磁盘上就是一个单独的目录。
part 目录的命名规则:{partition_name}_{min_block_number}_{max_number_block}_{level}
,例如 202202_1_6017_451
system.parts
表中每一行记录了一个part的信息,主要包括了:
partition
:分区名name
:part名part_type
:part存储格式,分为Wide
(每一列在文件系统中被存储为单独的文件)和Compact
(所有列被存储为一个文件)两种active
:表示这个数据part是否活跃;不活跃的parts由合并为更大的part后剩余的源part、损坏的数据part等rows
:这个part中包含了多少行min_block_number
和max_block_number
:合并后组成当前part的最小和最大的parts数量level
:合并树的深度,0表示当前part是由数据插入产生的,而不是由其他parts合并而来。path
:part文件的绝对路径data_compressed_bytes
和data_uncompressed_bytes
:part中压缩和未压缩的数据大小- …
parts 是在INSERT
时产生的,它们被周期性地合并为更大的parts。
每个part目录中都有一个minmax_{PARTITIONING_KEY_COLUMN}.idx
文件,该文件记录了用作分区key的列的最大和最小值。这些最大最小值会加载到内存中,供 SELECT
查询语句使用。
partition是parts的逻辑集合。理想情况下一个partition只有一个part。
partition是在建表语句中用PARTITION BY expr
语句指定的。
注意:
- 在大部分情况下不需要partition key,即使需要,大部分情况下也用不着比month更精细的partition
- partition并不会加速查询
- 只有相同partition表达式值的parts才会被合并。这意味着不应该用太精细的partition(超过一千个分区)。否则,会因为文件系统中的文件数量过多和需要打开的文件描述符过多,导致
SELECT
查询效率不佳。 - 可以使用
OPTIMIZE
语句来触发part的合并
参考:
Comments