clickhouse自定义分区及底层存储合并机制

自定义分区键

  • 分区是在建表时使用PARTITION BY expr 自居指定。
  • 分区键可以是表列中的任何表达式。
    • 例如,按月指定分区:PARTITION BY toYYYYMM(date_column).使用元组指定分区:PARTITION BY(toMondat(StartDate),EventType)
  • 在将新数据插入表中时,每个分区的数据存储为单独的数据片段(每个数据片段的数据是按逐渐排序的),在插入后的10~15分钟内,同一个分区的数据片段将合并为一个整体的数据片段。

分区目录的命名规则

根据分区表达式的数据类型,分区的命名规则是存在差异的。

  • 不指定分区:分区名称为all。
  • 数值数据类型:分区名称为数值。
  • 日期数据类型:将日期装换为数字作为分区名称。
  • 字符串数据类型:将日期转换为hash作为分区名称。

系统表:

SELECT partition,name,table,active FROM system.parts WHERE table like 'xxx';

创建不同分区案例

#1. 不指定分区
drop table test_partition_non;
create table test_partition_non(name String, timestamp DateTime) ENGINE=MergeTree() order by name;
insert into test_partition_non values ('nanjing', '2020-04-21 12:23:33');

#2. 数值
drop table test_partition_numeric;
create table test_partition_numeric(id UInt64, timestamp DateTime) ENGINE=MergeTree() order by id partition by id;
insert into test_partition_numeric values (556, '2020-04-21 12:23:33');

#3. 日期
drop table test_partition_date;
create table test_partition_date(date Date, timestamp DateTime) ENGINE=MergeTree() order by date partition by date;
insert into test_partition_date values ('2020-04-21', '2020-04-21 12:23:33');

#4. 字符串
drop table test_partition_string;
create table test_partition_string(name String, timestamp DateTime) ENGINE=MergeTree() order by name partition by name;
insert into test_partition_string values ('hangzhou', '2020-04-21 12:23:33');

#查看表:
SELECT partition, name, table, active FROM system.parts WHERE table like 'test_partition_%';

分区目录的合并过程

在将新数据插入表中时,每个分区的数据按照目录存储为单独的数据片段,目录名为数据片段抿成,这个和system.parts表的name字段一致。
在插入后的10~15分钟内,同一个分区的数据片段将合并为一个整体的数据片段。

数据片段名称包含了4部分的信息,下面以数据片段20200421_1_2_1为例进行拆解:

  • 20200421是分区名称
  • 1是数据块的最小编号。
  • 2是数据块的最大编号。
  • 1是块级别,即该块在MergeTree中的深度。

分区目录的合并过程

  • active列为数据片段的状态。1表示激活状态,0表示非激活状态。当源数据片段合并为较大的片段之后,这些源的数据片段就变为了非激活状态。损坏的数据片段也是非激活状态。
  • 同意分区有多个独立的数据片段,这表明这些片段尚未合并。
    • Clickhouse会在插入后大约15分钟合并数据片段,也可以使用OPTIMEZE语句执行计划外的合并:
    • OPTIMEZE TABLE mergeTableDemo PARTITION 202004;
  • 非激活的片段(active=0片段)将在合并后约10分钟被删除。
  • detached目录包含使用DETACHED语句从表分离的数据片段。损坏的数据片段也将移至该目录,而不是被删除。Clickhouse不会使用detached目录中的数据片段。此目录中的数据可以随时添加、删除、或修改,Clickhouse只有在运行ATTACH语句时才会感知该目录

分区表达式指定

alter语句、optimize语句通常需要指定分区的表达式,分区表达式的值为system.parts的partition字段,而不是分区的名称,这里需要注意。
因为字符串和日期类型的分区,分区名称和分区表达式的值是不一样的。

分区表达式的值是2020-04-21,分区名称为20200421
执行optimize操作optimize table test_ partition partition '2020-04 -21';
不能执行optimize table test_ partition partition '202004 21';

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值