Bucket table 是 ByteHouse 在建表的时候的一种性能优化选项,在 ByteHouse 中使用 Bucket table 时,系统会依据用户建表语句中提供的一个或者多个列、表达式整理表数据,将相同值的数据聚簇在同一个 bucket number 下,主要用于唯一键表 bucket 级别去重优化性能。没有唯一键的表,一般不需要配置 Bucket,除非需要两张表进行 colocation join,这时需要两张表的 bucket 配置一致。本文将介绍非唯一键表的分桶实践,唯一键表分桶请参见Bucket 去重优化。
使用 cluster key 聚簇数据在大表上可以获得以下几项收益:
Cluster key 可以是一个或者多个列、表达式,建议最多使用 3 个字段,更多的字段通常会引入过高的写入代价且获益语句范围更小。
选择正确的 cluster key 对于性能的影响非常显著,因此需要慎重选择。通常可以按照如下原则:
上述场景如果常用的情况是两列组合,比如 a = 1 and b = 2,那么 cluster key 选择两列可以获得更好的效果。
另一个需要考虑的维度是列的 distinct 值数量:
从性能和查询优化角度考虑,推荐使用如下表达式
CLUSTER BY EXPRESSION cityHash64V2(cluster_column) % N INTO N BUCKETS
在一个分区内:
因此选择一个合适的 bucket number 对于存储和查询都有重大的影响,唯一键表场景设置如何设置请参见ByteHouse 唯一键表最佳实践。
下面主要指非唯一键表的 bucket 数目设置最佳实践:
在运行过程中因为数据变化、查询模式变化、worker 节点数量变化,您可能会想要重新设置 cluster key 和 bucket number。
这里需要考虑实施修改的代价,权衡是否需要修改以及何时修改:
这里有两种情况:
假设某 ByteHouse 订阅用户启用了六个计算节点,由于单个分区的数据量较大,超过 2 亿条记录,应用程序经常根据 c1 和 c2 字段进行聚合和连接操作。 因此,决定使用桶表进行优化。 桶表的设计选项如下:
c1 和 c2 列作为分桶键。-- 创建带有分桶的表 create or replace table table_01 (c1 timestamp, c2 string, c3 number) CLUSTER BY EXPRESSION cityHash64V2(to_date(c1), c2) % 12 INTO 12 BUCKETS; -- 将桶添加到现有数据中 ALTER TABLE t CLUSTER BY EXPRESSION cityHash64V2(column, expression, ...) % 64 INTO 64 BUCKETS; -- 按多列将桶添加到集群中 ALTER TABLE t CLUSTER BY EXPRESSION cityHash64V2(a, b, c) % 64 INTO 64 BUCKETS; -- 添加或更改集群属性 ALTER TABLE t MODIFY CLUSTER BY EXPRESSION cityHash64V2(column, expression, ...) % 64 INTO 64 BUCKETS;