首页/数据/数仓建模速查/Doris 分区与分桶设计
湖仓与引擎63 条

Doris 分区与分桶设计

分区(Partition)通常按时间做 Range 划分并支持动态分区,分桶(Bucket)按 Hash 打散数据;分桶数过少会限制并行度,过多会产生小文件。

数仓建模速查数据更新于 2026-10-13

分区与分桶是什么

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 控制)。同一张表里既有归档数据又开了动态分区,归档数据会被清掉,归档应先迁出再收紧保留期。

易错点

  • 分桶数过少:单 tablet 数据量过大,查询并行度不足,导入也慢
  • 分桶数过多:tablet 数量与小文件数量膨胀,compaction 长期追不上写入
  • 分桶键选了低基数列或存在严重倾斜的值,数据集中到个别 tablet,其他节点空转
  • 动态分区 start 设得过小,历史分区被自动删除,只能从上游重灌
  • 副本数写 3 但 BE 节点不足 3 台,建表直接失败

数据来源与参考

  • Apache Doris 官方文档:Data Partitioning
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌