什么是 ClickHouse 中的表 parts?
ClickHouse MergeTree 引擎家族中每个表的数据,都会以一组不可变的
data parts 形式存储在磁盘上。
为了说明这一点,我们使用这张表 (改编自 UK property prices dataset) ,它记录了英国已售房产的成交日期、城镇、街道和价格:
当 ClickHouse server 处理上图中示意的包含 4 行的示例插入 (例如通过 INSERT INTO 语句) 时,会执行以下几个步骤: ① 排序:按表的排序键
(town, street) 对这些行进行排序,并为排序后的行生成一个稀疏主索引。
② 拆分:将排序后的数据拆分为各列。
③ 压缩:对每一列进行压缩。
④ 写入磁盘:压缩后的各列会以二进制列文件的形式保存到一个新目录中,该目录对应此次插入生成的 data part。稀疏主索引也会被压缩并存储在同一目录中。
根据表使用的具体引擎,在排序的同时还可能会发生其他转换。
数据 parts 是自包含的,包含了解释其内容所需的全部元数据,无需依赖中心目录。除稀疏主索引外,数据 parts 还包含其他元数据,例如二级数据跳过索引、列统计信息、校验和、最小-最大索引 (如果使用了分区) 以及更多。
parts 合并
为尽量减少初始 parts 的数量以及合并带来的开销,建议数据库客户端批量插入 Tuple,例如一次插入 20,000 行,或者使用asynchronous insert 模式。在这种模式下,ClickHouse 会将写入同一表的多个传入 INSERT 中的行缓存在一起,只有当缓冲区大小超过可配置阈值或发生 timeout 时,才会创建新的 part。
监控表 parts
_part,查询示例表中当前所有现存活动 parts 的列表: