Bucket table 是 ByteHouse 在建表的时候的一种性能优化选项,在 ByteHouse中使用 Bucket table 时,系统会依据用户建表语句中提供的一个或者多个列、表达式整理表数据,将相同值的数据聚簇在同一个 bucket number 下,从而在查询计算中获得更好的性能。
使用 cluster key 聚蔟数据在大表上可以获得以下几项收益:
distributed_perfect_shard
优化可以获得进一步的提高。Cluster key 可以是一个或者多个列、表达式,建议最多使用3个字段,更多的字段通常会引入过高的写入代价且获益语句范围更小。
选择正确的 cluster key 对于性能的影响非常显著,因此需要慎重选择。通常可以按照如下原则:
上述场景如果常用的情况是两列组合,比如 a = 1 and b = 2,那么 cluster key 选择两列可以获得更好的效果。
另一个需要考虑的维度是列的 distinct 值数量:
在一个分区内:
因此选择一个合适的 bucket number 对于存储和查询都有重大的影响,一般有如下原则:
在运行过程中因为数据变化、查询模式变化、worker节点数量变化,用户可能会想要重新设置 cluster key 和 bucket number。
这里需要考虑实施修改的代价,权衡是否需要修改以及何时修改:
这里有两种情况:
假设某 ByteHouse 订阅用户启用了六个计算节点,由于单个分区的数据量较大,超过2亿条记录,应用程序经常根据c1
和c2
字段进行聚合和连接操作。 因此,决定使用桶表进行优化。 桶表的设计选项如下:
c1
和c2
列作为分桶键。-- 创建带有分桶的表 create table with bucketing create or replace table table_01 (c1 timestamp, c2 string, c3 number) cluster by (to_date(c1), c2) INTO 12 BUCKETS; -- 将桶添加到新数据中 add bucket to newly inserted data ALTER TABLE t MODIFY CLUSTER BY (column, expression, ...) INTO 64 BUCKETS -- 按多列将桶添加到集群中 add bucket to cluster by multiple columns ALTER TABLE t MODIFY CLUSTER BY sipHash(a,b,c) INTO 64 BUCKETS -- 添加或更改集群属性 Add or change the cluster properties ALTER TABLE t MODIFY CLUSTER BY (column, expression, ...) INTO 64 BUCKETS -- 将现有分区数据重新分桶 recluster existing partitions ALTER TABLE t RECLUSTER PARTITION '2024-01-01'; ALTER TABLE t RECLUSTER PARTITION ID '20240101'; ALTER TABLE t RECLUSTER PARTITION WHERE p_date > '2024-01-01';