Doris数据表、分区、分桶设计详解

1、表数据模型:
数据以表(Table)的形式进行逻辑上的描述。
一张表包括行(Row)和列(Column)。
Row即用户的一行数据,Column用于描述一行数据中不同的字段。
Column可以分为两大类:Key和Value,从业务角度看分别对应,维度列和指标列。
Doris 的Key列是建表语句中指定的列,建表语句中的关键字unique key或aggregate key或duplicate key后面的列就是Key列,除了Key列剩下的就是Value列。
Doris 的数据模型主要分为3类:
明细模型 Duplicate
主键模型 Unique
聚合模型 Aggregate

建表的列类型建议
1、Key列必须在所有Value列之前。
2、尽量选择整型类型。因为整型类型的计算和查找效率远高于字符串。
3、对于不同长度的整型类型的选择原则,遵循够用即可。
4、对于VARCHAR和STRING类型的长度,遵循够用即可。

模型选择建议
因为数据模型在建表时就已经确定,且无法修改。所以,选择一个合适的数据模型非常重要。
1、Aggregate模型可以通过预聚合,极大地降低聚合查询时所需扫描的数据量和查询的计算量,非常适合有固定模式的报表类查询场景。
但是该模型对 count(*) 查询很不友好。同时因为固定了 Value 列上的聚合方式,在进行其他类型的聚合查询时,需要考虑语意正确性。
2、Unique模型针对需要唯一主键约束的场景,可以保证主键唯一性约束。
但是无法利用ROLLUP等预聚合带来的查询优势。对于聚合查询有较高性能需求的用户,推荐使用自1.2版本加入的写时合并实现。
3、Duplicate适合任意维度的Ad-hoc查询。
虽然同样无法利用预聚合的特性,但是不受聚合模型的约束,可以发挥列存模型的优势(只读取相关列,而不需要读取所有Key列)

2、分区和分桶(Partition & Tablet)
Doris支持两层的数据划分。
第一层是支持水平分区(Partition),支持Range和List的划分方式。
将数据按

<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、付费专栏及课程。

余额充值