数据分布
建表时,您可以通过设置合理的分区和分桶,实现数据均匀分布和查询性能提升。数据均匀分布是指数据按照一定规则划分为子集,并且均衡地分布在不同节点上。查询时能够有效裁剪数据扫描量,最大限度地利用集群的并发性能,从而提升查询性能。
说明
- 您在建表时设置数据分布后,如果业务场景查询模式和数据特点发生变化,则自 3.2 版本起,StarRocks 支持您在建表后修改一些数据分布相关属性,以满足最新业务场景对查询性能的要求。
- 自 3.1 版本起,您在建表和新增分区时可以不设置分桶键(即 DISTRIBUTED BY 子句)。StarRocks 默认使用随机分桶,将数据随机地分布在分区的所有分桶中。更多信息,请参见随机分桶。
- 自 2.5.7 版本起,您在建表和新增分区时可以不设置分桶数量 (BUCKETS)。StarRocks 默认自动设置分桶数量,如果自动设置分桶数量后性能未能达到预期,并且您比较熟悉分桶机制,则您也可以手动设置分桶数量。
功能简介
常见的数据分布方式
现代分布式数据库中,常见的数据分布方式有如下几种:Round-Robin、Range、List 和 Hash。如下图所示:
-
Round-Robin:以轮询的方式把数据逐个放置在相邻节点上。
-
Range:按区间进行数据分布。如上图所示,区间 [1-3]、[4-6] 分别对应不同的范围 (Range)。
-
List:直接基于离散的各个取值做数据分布,性别、省份等数据就满足这种离散的特性。每个离散值会映射到一个节点上,多个不同的取值可能也会映射到相同节点上。
-
Hash:通过哈希函数把数据映射到不同节点上。
为了更灵活地划分数据,除了单独采用上述数据分布方式之一以外,您还可以根据具体的业务场景需求组合使用这些数据分布方式。常见的组合方式有 Hash+Hash、Range+Hash、Hash+List。
StarRocks 的数据分布方式
StarRocks 支持单独和组合使用数据分布方式。
说明
除了常见的分布方式外, StarRocks 还支持了 Random 分布,可以简化分桶设置。
并且 StarRocks 通过设置分区 + 分桶的方式来实现数据分布。
- 第一层为分区:在一张表中,可以进行分区,支持的分区方式有表达式分区、Range 分区和 List 分区,或者不分区(即全表只有一个分区)。
- 第二层为分桶:在一个分区中,必须进行分桶。支持的分桶方式有哈希分桶和随机分桶。
数据分布方式 | 分区和分桶方式 | 说明 |
---|---|---|
Random 分布 | 随机分桶 | 一张表为一个分区,表中数据随机分布至不同分桶。该方式为默认数据分布方式。 |
Hash 分布 | 哈希分桶 | 一张表为一个分区,对表中数据的分桶键值使用哈希函数进行计算后,得出其哈希值,分布到对应分桶。 |
Range+Random 分布 |
|
|
Range+Hash 分布 |
|
|
List+Random 分布 |
|
|
List+ Hash 分布 |
|
|
-
Random 分布
建表时不设置分区和分桶方式,则默认使用 Random 分布
CREATE TABLE site_access1 (
event_day DATE,
site_id INT DEFAULT '10',
pv BIGINT DEFAULT '0' ,
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT ''
)
DUPLICATE KEY (event_day,site_id,pv);
-- 没有设置任何分区和分桶方式,默认为 Random 分布(目前仅支持明细表) -
Hash 分布
CREATE TABLE site_access2 (
event_day DATE,
site_id INT DEFAULT '10',
city_code SMALLINT,
user_name VARCHAR(32) DEFAULT '',
pv BIGINT SUM DEFAULT '0'
)
AGGREGATE KEY (event_day, site_id, city_code, user_name)
-- 设置分桶方式为哈希分桶,并且必须指定分桶键
DISTRIBUTED BY HASH(event_day,site_id); -
Range + Random 分布
CREATE TABLE site_access3 (
event_day DATE,
site_id INT DEFAULT '10',
pv BIGINT DEFAULT '0' ,
city_code VARCHAR(100),
user_name VARCHAR(32) DEFAULT ''
)
DUPLICATE KEY(event_day,site_id,pv)
-- 设为分区方式为表达式分区,并且使用时间函数的分区表达式(当然您也可以设置分区方式为 Range 分区)
PARTITION BY date_trunc('day', event_day);
-- 没有设置分桶方式,默认为随机分桶(目前仅支持明细表)