数据分区:即将大表划分为小表,数据分区主要有两个级别:Partition和Bucket(Tablet)。
Partition:逻辑分区,按照一定规则将表按照行进行划分,每个部分就是一个Partition。
Bucket:物理分区则,在物理上对每个Partition内的数据进行进一步的细分(按行)。分桶时,会选取一列,如Id,按照id的hashcode值%桶数,得到数据所在桶的位置。存储时,会创建文件夹对数据进行存储,文件夹的名字就是桶号。
Partition
Partition支持Range和List两种划分方式
Range(范围分区,单列分区):
PARTITION BY RANGE(data)
(
PATITION ‘p201701’ VALUES LESS THAN(‘2017-02-01’),
PATITION ‘p201702’ VALUES LESS THAN(‘2017-03-01’),【0201,0301)
PATITION ‘p201703’ VALUES LESS THAN(‘2017-04-01’),
)
Attention:分区的上界,前闭后开,当分区创建完成后,某个分区再被删除时,其他分区的范围并不受影响(分区空洞),但分区空洞可以通过创建新的分区进行补充。
Range(范围分区,多列分区):
PARTITION BY RANGE(`date`, `id`)
(
PARTITION `p201701_1000` VALUES LESS THAN ("2017-02-01", "1000"), #设置分区上界和id上界
PARTITION `p201702_2000` VALUES LESS THAN ("2017-03-01", "2000"),
PARTITION `p201703_all` VALUES LESS THAN ("2017-04-01") ,#没有指定时会按照默认值,同样遵守前闭后开原则
)
Attention:如果日期不在分界点上,可以只看日期,如果在分界点上,先比较日期,在比较后续字段的值,如果值大于分界点的值就落入前者分区,否则落入后者分区
List分区(单列分区):
支持BOOLEAN,TINYINT,SMALLINT,INT,BIGINT,LARGEINT.,CHAR...多种数据类型,当分区值为枚举值,只有当数据为目标分区枚举值其中之一时,才可以命中分区。
PARTITION BY List (”分区字段”)
(
PARTITION “分区名” VALUES IN (“枚举值”,”枚举值”,”枚举值”)
)
Attention: 当要插入的值与该分区中的值相同时,则插入该分区中
List分区(多列分区):
PARTITION BY List (”分区字段”,”分区字段”)
(
PARTITION “分区名” VALUES IN ((“枚举值”,”枚举值”),(”枚举值”,”枚举值”))
)
Attention:对于多列分区,只有所有字段的值都与该分区中的值相同时,才会插入该分区中
分桶
如果使用了分区,则DISTRIBUTED..描述的数据实在各个分区内划分规则,否则描述的时整张表的数据的划分规则。
Attention:
- 分桶可以时多列,但必须为KEY列,分桶列可以与分区列相同或不同
- 分桶列的选择实在查询吞吐和查询并发之间的一种权衡
如果选择多个分桶列,则经过Hash散列后,数据分布会更均匀
如果选择一个或少数分桶列,则数据分布较为集中
复合分区和单分区
复合分区:建表时不仅指定分区还会指定分桶
单分区:没有分区,只有分桶,此时Doris底层会将整张表作为一个分区
复合分区使用场景:
- 标中字段有时间维度或类似带有有序值的维度,可以以这类维度列作的分区列。
- 有删除历史数据的需求(比如仅保留最近N天的数据)可以通过删除除历史分区来达到目的。也可以通过在指定分区内发送DELETE语句进行数据出除
- 解决数据倾斜问题:每个分区可以单独指定分桶数量。如按天分区,当每天的数据量差异很大时,可以通过指定分区的分桶数,合理划分不同分区的数据,分桶列建议选择区分度大的列
PROPERTIES
在建表语句中用于设置表的属性参数
常用属性有:
- replication_num(分片副本数):用于指定每个Tablet的副本数量,提高数据安全性并且能够在Sql执行过程中提高在本地查询命中的概率。副本数量在运行时可以进行修改,最大副本数量取决于集群中独立IP的数量
- Storage_medium(存储介质):默认存储介质可以通过fe的配置文件指定,默认为HDD,如果指定为SSD,则数据初始存放在SSD上,在没有storage_cooldown_time的情况下,默认30填后,数据会从SSD上自动迁移至HDD上,若指定,则按照指定时间迁移。
- Storage_cooldown_time(热数据冷却时间)