ClickHouse在版本 1.1.54310中引入了一个新特性:可以在MergeTree引擎的表上自定义分区。在引入这个特性之前,创建MergeTree必须使用日期字段进行分区之前以及按月分区。
新版本允许更多的灵活性,我们可以选择不仅基于日期字段的分区模式。
该功能仍在实验阶段,我们需要启动experimental_allow_extended_storage_definition_syntax标志服务器。
使用命令:
set experimental_allow_extended_storage_definition_syntax = 1
我们来看看如何使用这个自定义分区。
我们将从网页https://clickhouse.yandex/docs/en/getting_started/example_datasets/ontime.html中提到的on-time基准表作为例子:
该表格创建为:
) ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192)
新的语法可以被重写为:
) ENGINE = MergeTree PARTITION BY toYYYYMM(FlightDate) Order By Year, FlightDate;
照葫芦画瓢,更改日常分区的定义:
) ENGINE = MergeTree PARTITION BY FlightDate Order By Year, FlightDate;
或者使用不同的非日期列分区:
) ENGINE = MergeTree PARTITION BY AirlineID Order By FlightDate;
现在,我们可以删除一个特定日期的数据(例如1987-01- 01)
ALTER TABLE ontime DROP PARTITION '1987-10-01';
为什么这个功能有用?
它提供了更好的粒度来管理数据。我们可以在商务任务所需的时间内执行数据维护,而不仅仅是按照规定的每月时间进行。
比如:我们可以一周删除一次数据,而非按月的粒度
有一件事要注意,粒度更细的分区可能会影响压缩。
例如,使用默认的每月分区和LZ4压缩,完整的ontime表在磁盘上占用7.7GB,而当我们切换到每日分区时,大小增长到15GB。这是因为用于压缩的数据变得更短,所以压缩效率较低。
网友评论