clickhouse partition 设定分区

clichouse会对数据分区存放,可以提高效率,便于维护磁盘空间。

clickhouse不建议按照条件查询使用delete删除数据。

clickhouse提供了ttl,可以设定数据的生命周期,到了时间,会自动删除数据。

如需维护磁盘使用,clickhouse提供了操作分区的功能。

设定数据库表分区

以官方示例为例

CREATE TABLE visits
(
    VisitDate Date,
    Hour UInt8,
    ClientID UUID
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(VisitDate)
ORDER BY Hour;

创建一个表,定义partition根据toYYYYMM(VisitDate)分区,VisitDateshi是时间toYYYYMM(VisitDate)是把时间转成年月,所以这个表就会根据月分区。

同样也可以根据自己需要设定分区

ENGINE = ReplicatedCollapsingMergeTree('/clickhouse/tables/name', 'replica1', Sign)
PARTITION BY (toMonday(StartDate), EventType)
ORDER BY (CounterID, StartDate, intHash32(UserID));

注意,设定partition的规则颗粒度不要太细,如果分区太多(超过1000),会影响性能。

可以从系统表获取分区信息

SELECT * FROM system.parts
┌─partition─┬─name───────────────────┬─active─┐
|20231215   |20231215_1_8510_14      |1       |
|20231215   |20231215_8511_14172_11  |1       |
|20231215   |20231215_14173_15784_10 |1       |
|20231215   |20231215_15785_17648_10 |1       |
|20231215   |20231215_17649_17838_8  |0       | 
└───────────┴────────────────────────┴────────┘

partition是分区id,相同的id的数据会放到一起,如果有多个,说明还处于分区周期没有完全合并,或者说数据量太大需要多个片段保存。

20231215_1_8510_14

  • 20231215是分区的id
  • 1是当前分区的第一个数据块的编号
  • 8510是当前分片的最后一个数据块编号,所以下一个片段就是从8511开始
  • 14 the mutation version (if a part mutated) 大体应该是该分片变化的版本号,因为数据不断插入,clickhouse一直在更新合并

分区还有一些其他作用,比如数据库表中有表示省份的字段,可以用该字段进行分区,把每个省的数据放一起,或者可以对数据进行哈希计算,把数据平均的放到不同的分区中。

分区的操作

分区的操作都是基于某个表的,虽然所有的表,使用相同的分区规则,会有相同的分区id,但是可以通过select database,table,partition,name, bytes_on_disk,path from system.parts where partition='20240111'增加path路径查看,可以看到不同表的数据存放在不同目录下,还是以表为单位进行维护的。

删除

ALTER TABLE tcp DROP PARTITION 20240117

删除tcp表的20240117的分区
删除后再从system.parts搜索,有可能数据还是存在的,但是占用磁盘空间少了,变成了13,说明删除成功。
过一会之后clickhouse会把分区完全删除,无法再搜到。

复制

ALTER TABLE tcp1 REPLACE PARTITION 20240117 FROM tcp2

把tcp2的数据复制到tcp1

卸载/装载

ALTER TABLE tcp DETACH PARTITION 20240117

卸载后的数据还是在磁盘上的,但是clickhouse不再维护,从clickhouse也搜索不到相关数据。主要用作迁移备份维护。
卸载后的数据会被移动到detached目录下

ALTER TABLE tcp ATTACH PARTITION 20240117

https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key
https://clickhouse.com/docs/en/sql-reference/statements/alter/partition

posted @ 2023-12-15 16:25  秋来叶黄  阅读(355)  评论(0编辑  收藏  举报