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