Doris 分区与分桶

分区与分桶概述

分区与分桶秉承着"大而化小,分而治之"的目标,目的都是为了便于查询,提高查询的效率。

分区的定义: 对数据进行水平切分,水平切分之后数据是完全物理隔离的,每个分区即为一个物理文件夹。

比如一个网站每天的埋点行为日志数据量比较大,在查询时进行全表扫描耗费的资源非常多。那在这个情况大数据体量下,可以按照每天日期对数据表进行分区,不同日期的数据存放在不同的分区下,在查询时只要指定分区字段的值就可以直接从该分区查找。

分桶的定义: 对数据进行垂直切分,各个分桶相互独立,每个分桶即为一个文件。

比如我们按照name列分为4个桶,就是对name列值的hash值对4取摸,按照取模结果对数据分桶。如取模结果为0的数据记录存放到一个文件,取模为1的数据存放到一个文件,取模为2的数据存放到一个文件、取模为3的数据存放到一个文件。

从上面可见,分区注重粗粒度,而分桶注重细粒度。同时需要注意的是这存在一定的担忧:分区容易造成数据倾斜。

今天主要讲讲,Doris分区与分桶。

Doris支持两级分区存储, 第一层为 range 分区,也可支持list方式, 第二层为 hash分桶。

Drois分区

注意点

(1)分区列必须为key列。

(2)分区列可以指定一列或多列。

(3)不论分区列是什么类型,在写分区值时,都需要加双引号。

(4)add partition添加分区,可以为该分区单独指定桶的数量。

Range 分区

通过 values less than (xxx) 仅指定上界,系统会将前一个分区的上界作为该分区的下界,生成一个左闭右开的区间。

同 Range Partition,当导入数据值在分区范围外,则不会被导入。

PARTITION BY RANGE (`dt`)
(
PARTITION p_20220501 VALUES LESS THAN ("2022-05-01"),
PARTITION p_20220502 VALUES LESS THAN ("2022-05-02"),
PARTITION p_20220503 VALUES LESS THAN ("2022-05-03"),
PARTITION p_20220504 VALUES LESS THAN ("2022-05-04")
)

List 分区

通过 VALUES IN (xxx) 来指定每个分区包含的枚举值,分区值为枚举值。只有当数据为目标分区枚举值其中之一时,才可以命中分区。

现List Partition 的分区列必须为 NOT NULL 列

PARTITION BY RANGE (`city_code`)
(
PARTITION `p_city` VALUES IN ("1001", "1002", "1003")
)

多列分区

PARTITION BY LIST(`id`, `city_code`)

(
PARTITION `p_id_city` VALUES IN (("1", "1000"), ("1", "1001"))
)

动态分区

表按date或datetime类型字段进行分区,对于新的数据,需要我们手动添加分区,和删除旧的分区,自动的总比手动的更加方便些。

PARTITION BY RANGE(dt)()
PROPERTIES
(
    "dynamic_partition.enable" = "true",
    "dynamic_partition.time_unit" = "DAY",
    "dynamic_partition.end" = "3",
    "dynamic_partition.prefix" = "p",
	"replication_num" = "1"
);

key

说明

dynamic_partition.enable

是否开启动态分区

dynamic_partition.time_unit

区时间单位可以是hour、day、week、month。(yyyyMMddHH)

dynamic_partition.start

动态分区的起始偏移量,分区范围在此偏移之前的分区将会被删除,默认不删

dynamic_partition.end

动态分区的结束偏移量,以当前为基准,提前创建对应范围的分区

dynamic_partition.prefix

分区名前缀

以当前天(20220504)为基准,会提前创建三天的分区(20220505,20220506,20220507)

其他操作

关掉动态分区

ALTER TABLE xxx SET ("dynamic_partition.enable" = "false")

删除分区

ALTER TABLE xxx DROP PARTITION p_20220504;

新建分区

ALTER TABLE xxx ADD PARTITION p_20220505 VALUES [('2022-05-05'), ('2022-05-06'));

查看分区

show partitions from xxx

Drois 分桶

DISTRIBUTED BY HASH(id) BUCKETS 10

注意点

(1)分桶列可以是多列,但必须为 Key 列。

  • 分桶列少:对应的查询可以仅触发分桶扫描区域就少,查询之间的IO影响较小,适合高并发。
  • 分桶列多,数据分布更均匀,查询有可能会触发所有分桶同时扫描,查询的吞吐会增加,适合大吞吐低并发的查询。

(2)分桶列可以和分区列相同或不同。

<think>好的,我现在要详细回答用户关于Apache Doris分区的区别的问题。首先,我需要回忆一下Doris的架构和数据管理方式。根据用户提供的引用内容,分区都是数据划的方法,但它们的用途和实现方式不同。 首先,分区Partition)的概念。引用[4]提到,Doris分区有手动和动态两种方式,动态分区通常按时间划。比如按天分区,这样数据可以按时间范围管理,便于删除旧数据或加载新数据。而引用[5]中的Auto List Partition功能允许自动根据列值创建分区,比如城市名,这样分区更灵活。分区的目的是将数据按特定维度(如时间、地区)划,便于管理和查询时的剪枝优化,减少扫描的数据量。 然后是(Bucket)。引用[1]指出,通过哈希列的值将数据配到不同的中,每个对应一个数据片,是物理上的划列的选择很重要,引用[3]提到要选区度大的列,避免数据倾斜。的作用是散数据,提高并行处理能力,同时优化join和聚合操作的性能。 接下来需要区两者的不同点。分区是逻辑上的划,按范围或列表,用于数据管理;是物理上的,通过哈希布,影响存储和查询性能。用户可能需要知道如何选择分区键和键,以及实际应用中的最佳实践,比如分区按时间,按高基数列。 还要注意用户提供的引用内容中提到的数量可以按分区单独指定,这在处理不同分区数据量差异大时很有用,比如每天的数据量不同,可以调整数来平衡负载。同时,列的选择要避免数据倾斜,否则某些可能过大,影响性能。 总结时,需要强调分区在数据管理中的作用,以及它们如何协同工作提升Doris的性能和扩展性。用户可能还会关心如何配置和优化这两个参数,比如动态分区和自动列表分区的使用技巧,列的选择策略等。 现在需要组织这些信息,确保结构清晰,点说明概念、区别、选择建议,并引用提供的资料作为支持。同时,生成相关问题,帮助用户进一步理解。</think>### Apache Doris 分区详解 #### **1. 分区Partition)** - **概念**:分区是数据的**逻辑划**,根据特定规则(如时间范围、枚举值)将表数据划为多个独立管理的单元。 - **核心特性**: - **管理维度**:通常按时间(如按天/月)或枚举值(如城市名)划[^4][^5]。 - **数据剪枝**:查询时通过分区键快速过滤无关分区,减少数据扫描量。例如,查询某月数据时仅需扫描对应分区。 - **灵活配置**:支持动态分区(自动按时间创建或删除分区)和 Auto List Partition(按枚举值自动分区)[^4]。 - **示例**: ```sql -- 按天动态分区 PARTITION BY RANGE(dt) (START ("2023-01-01") END ("2023-12-31") EVERY (INTERVAL 1 DAY)) -- Auto List Partition(按城市名自动分区PARTITION BY LIST(city) () ``` #### **2. (Bucket)** - **概念**:是数据的**物理划**,通过哈希函数将数据散到多个存储单元()中,每个对应一个数据片。 - **核心特性**: - **存储优化**:数据均匀布到不同中,避免热点问题[^1][^3]。 - **并行计算**:查询时多个可并行处理,提升性能(如聚合、JOIN操作)[^1]。 - **键选择**:需选择高基数列(如用户ID),确保数据布均匀。 - **示例**: ```sql DISTRIBUTED BY HASH(user_id) BUCKETS 10 ``` #### **3. 分区 vs 对比** | **维度** | **分区** | **** | |----------------|-----------------------------------|-----------------------------------| | **划方式** | 逻辑划(范围/列表) | 物理划(哈希) | | **目的** | 数据管理、查询剪枝 | 负载均衡、并行计算 | | **键选择** | 时间、地区等低基数列 | 用户ID等高基数列 | | **灵活性** | 支持动态调整(如删除旧分区) | 建表时固定,修改需重建表 | #### **4. 协同工作配置建议** - **层设计**: 1. **先分区**:按时间或业务维度划大范围数据。 2. **再**:在每个分区内通过哈希实现细粒度布[^3]。 - **优化技巧**: - 分区大小建议 **1GB~10GB**,数量建议 **10~100个**。 - 处理数据倾斜时,可为不同分区单独指定数[^3]。 - 动态分区适合时间序列数据,Auto List Partition 适合固定枚举值场景[^4]。 #### **5. 总结** - **分区**用于逻辑上的数据管理,核心是**降低维护成本**和**加速查询过滤**。 - ****用于物理上的数据布,核心是**提升并行效率**和**避免数据倾斜**。 - 两者结合可实现**“粗粒度管理 + 细粒度优化”**,是 Doris 高性能查询的基石[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值