手动合并分区
如果要立即合并临时分区,可通过手动 merge
语法一
optimize table 表名 final;
语法二
强制merge建议带分区
optimize table 表名 partition ID '分区id' final;
或
optimize table 表名 partition '分区id' final;
注意
强制merge属于CPU性操作,会相当耗费CPU资源,建议在晚上系统负载比较小的时候执行
强制merge不会有锁的概念,表还是可以正常查询写入
合并方式
将原分区的数据合并,生成一个新的目录,该目录命名规则是:分区ID_最小分区块编号_最大分区块编号_合并次数
原分区目录仍存在,是过期的,大约 8 分钟后,会自动清理掉
案例
执行合并
optimize table t_student_mt final;
执行查询
在 clickhouse-client 中执行查询:
select * from t_student_mt ;
执行结果如下:
┌─sid─┬─name───┬─age─┬─heigth─┬─────────create_time─┐
│ 2 │ 韩梅梅 │ 19 │ 165 │ 2022-01-01 09:30:00 │
│ 2 │ 李雷 │ 20 │ 182 │ 2022-01-01 09:30:00 │
│ 5 │ 武大郎 │ 25 │ 178 │ 2022-01-01 10:30:00 │
└─────┴────────┴─────┴────────┴─────────────────────┘
┌─sid─┬─name───┬─age─┬─heigth─┬─────────create_time─┐
│ 1 │ lucy │ 22 │ 170 │ 2022-01-02 09:30:00 │
│ 4 │ 张三 │ 21 │ 171 │ 2022-01-02 09:50:00 │
│ 4 │ lili │ 22 │ 171 │ 2022-01-02 09:50:00 │
│ 6 │ 武二郎 │ 23 │ 181 │ 2022-01-02 11:50:00 │
└─────┴────────┴─────┴────────┴─────────────────────┘
┌─sid─┬─name───┬─age─┬─heigth─┬─────────create_time─┐
│ 6 │ 武四郎 │ 22 │ 183 │ 2022-01-03 12:50:00 │
└─────┴────────┴─────┴────────┴─────────────────────┘
可以看到只有 3 个分区
查看文件
ll /program/clickhouse/data/data/default/t_student_mt/
显示如下:
20220101_2_2_0
20220101_2_3_1
20220101_3_3_0
20220102_1_1_0
20220102_1_4_1
20220102_4_4_0
20220103_5_5_0
20220103_5_5_1
其中下面目录是新生成的:
20220101_2_3_1
20220102_1_4_1
20220103_5_5_1
20220103_5_5_0
合并方式
20220101_2_2_0 和 20220101_3_3_0 会合并, 生成一个新目录,名字是:_2_3_1。目录名生成规则:最小块数是 2,最大块数是 3,合并 1 次
20220102_1_1_0 和 20220102_4_4_0 会合并, 生成一个新目录,名字是:_1_4_1。目录名生成规则:最小块数是 1,最大块数是 4,合并 1 次
查询表分区信息
SELECT
partition,
name,
part_type,
active
FROM system.parts
WHERE table = 't_student_mt'
可以看到 原分区的 active 是0,非激活状态
原分区目录的处理方式
原分区目录是过期的,但数据仍然存在,大约过8分钟后,会自动清理掉
案例2
指定分区id进行合并
optimize table t_student_mt partition ID '20220101' final;