分区与分桶是什么
Doris 的表在水平方向上做两级切分:分区 Partition 按列的范围(通常用时间)划分,主要用于生命周期管理与分区裁剪;分桶 Bucket 在分区内部按列哈希打散,决定数据落在哪个 tablet,也就是查询与导入的并行单位。分区数随天数自然增长,分桶数在建表时固定,两者相乘再乘副本数就是 tablet 总量,这个数字直接决定元数据与 compaction 的压力。
基本信息
| 适用平台 | Apache Doris 1.x/2.x |
|---|---|
| 分区方式 | PARTITION BY RANGE(列),以时间分区为主;也支持 List 分区 |
| 分桶方式 | DISTRIBUTED BY HASH(列) BUCKETS n |
| 容量建议 | 单个 tablet(分桶)控制在 1-10GB 量级 |
| tablet 总量 | 分区数 × 分桶数 × 副本数 |
| 动态分区参数 | dynamic_partition.enable / time_unit / start / end |
| 副本数 | replication_num,默认 3,不能超过 BE 节点数 |
典型使用场景
- 按天分区加动态分区:每天自动预建未来若干天分区,导入不会因为缺分区而失败
- 按保留期自动淘汰:把 start 设为 -90 只保留近 90 天,过期分区自动删除,省掉人工清理
- 分桶键选高基数列(订单号、用户 ID),让数据与查询都均匀落到各 tablet
- 分桶键与高频 join 列一致,多表桶数相同时可走 Colocation Join,省掉数据重分布
- 历史数据归档:把冷分区迁到冷存储或直接 DROP PARTITION,控制单表规模
动态分区加哈希分桶
动态分区加哈希分桶
CREATE TABLE dw.dws_trade_store_day (
dt DATE NOT NULL,
store_id VARCHAR(32) NOT NULL,
pay_amt DECIMAL(18,2) SUM DEFAULT '0'
)
AGGREGATE KEY(dt, store_id)
PARTITION BY RANGE(dt) () -- 空括号:分区交给动态分区自动建
DISTRIBUTED BY HASH(store_id) BUCKETS 16
PROPERTIES (
'replication_num' = '3', -- 副本数不能超过 BE 节点数
'dynamic_partition.enable' = 'true',
'dynamic_partition.time_unit' = 'DAY',
'dynamic_partition.start' = '-90', -- 仅保留近 90 天,超期自动删除
'dynamic_partition.end' = '3' -- 预建未来 3 天分区
);
-- 初始化历史数据时手工补分区
ALTER TABLE dw.dws_trade_store_day ADD PARTITION p20261012 VALUES [('2026-10-12'), ('2026-10-13'));分区与分桶职责
| 维度 | 分区 Partition | 分桶 Bucket |
|---|---|---|
| 划分依据 | 按列范围,通常是日期 | 按列哈希取模 |
| 数量变化 | 随数据天数增长 | 建表时固定 |
| 主要作用 | 生命周期管理、分区裁剪 | 数据分片、并行度、join 分布 |
| 过多后果 | tablet 与元数据膨胀 | 小文件多、导入与 compaction 压力大 |
| 运维动作 | 增删分区、开动态分区 | 调整桶数需重建表或改分布 |
tablet 总数是分区数与分桶数、副本数三者的乘积。按天分区保留三年、分桶数取 64 的表,tablet 数量会到几十万级,元数据内存与调度开销都很可观,分桶数要按数据量反推而不是凭感觉放大。
开启动态分区后超期分区会被自动删除(范围由 start 控制)。同一张表里既有归档数据又开了动态分区,归档数据会被清掉,归档应先迁出再收紧保留期。