跳到主要内容
跳到主要内容

表分区

ClickHouse中的表分区是什么?


在ClickHouse MergeTree 引擎系列中,每个表的数据在磁盘上的组织形式是一组不可变的 data parts

为了解释这一点,我们使用这个表(改编自英国房产价格数据集),用于跟踪英国售出房产的日期、城镇、街道和价格:

您可以在我们的 ClickHouse SQL Playground 中查询这个表

每当一组行被插入到表中时,就会创建一个数据分区。以下图示简要说明了这一过程:

插入处理

当ClickHouse服务器处理上面的示例插入(例如,通过INSERT INTO 语句)时,它会执行几个步骤:

排序:这些行根据表的排序键(town, street)进行排序,并为排序后的行生成一个稀疏主键索引

拆分:排序后的数据被拆分成列。

压缩:每一列都被压缩

写入磁盘:被压缩后的列作为二进制列文件保存在一个新的目录中,该目录表示插入的数据分区。稀疏主键索引也被压缩并保存在同一目录中。

根据表的具体引擎,排序过程中可能会发生额外的转换可能会

数据分区是自包含的,包括解释其内容所需的所有元数据,而无需中央目录。除了稀疏主键索引,分区还包含其他元数据,例如二级数据跳过索引列统计、检查和最小-最大索引(如果使用了分区),以及更多

分区合并

为了管理每个表的分区数量,后台合并作业会定期将较小的分区合并为较大的分区,直到它们达到可配置的压缩大小(通常约150 GB)。合并后的分区被标记为非活动状态,并在可配置的时间间隔后被删除。随着时间的推移,这一过程创建了一个合并分区的层次结构,这就是为什么它被称为MergeTree表的原因:

分区合并

为了减少初始分区数量和合并的开销,数据库客户端被鼓励批量插入元组,例如一次插入20,000行,或使用异步插入模式,在这种模式下,ClickHouse将来自多个插入的行缓冲到同一个表中,仅在缓冲区大小超过可配置阈值或超时到期后才创建新的分区。

监控表分区

您可以通过使用虚拟列 _part查询我们示例表当前所有活动分区的列表:

上述查询检索磁盘上目录的名称,每个目录代表表的一个活动数据分区。这些目录名称的组成部分具有特定的含义,感兴趣的读者可以在这里找到相关文档。

另外,ClickHouse在system.parts系统表中跟踪所有表所有分区的信息,以下查询返回我们上述示例表当前所有活动分区的列表、其合并级别和存储在这些分区中的行数:

每次对分区进行额外的合并时,合并级别增加1。级别为0表示这是一个尚未合并的新分区。