你是否遇到过这些情况——建表时拍脑袋定了分桶数,结果数据量暴涨后查询越来越慢;或者按天分区,但想按门店聚合时扫描了全表?Doris的二级分区+动态分桶就是用来解决这些问题的。本文结合JVS-智能BI的实际落地,拆解如何用Doris支撑千亿级数据秒级查询。
一、为什么JVS-智能BI选择了Doris?
选型时对比了ClickHouse、TiDB、Doris,最终Doris胜出的原因:
- 标准SQL: 业务人员上手快,不用学新语法。
- 高并发+批量分析兼顾: Unique Key支持实时更新,Aggregate Key支持预聚合。
- 二级分区: 按时间和业务维度双重分区,查询裁剪效率极高。
- 动态分桶: 数据量变化时自动调整分桶数,告别小文件灾难。
二、二级分区到底怎么用?
场景: 零售企业销售事实表,经常按 sale_date 筛选,也常按 store_id 分组。
建表语句(直接可执行):
CREATE TABLE sales_fact (
sale_date DATE,
store_id INT,
product_id INT,
sale_amount DECIMAL(10,2),
sale_quantity INT
)
DUPLICATE KEY(sale_date, store_id)
PARTITION BY RANGE(sale_date) (
PARTITION p202501 VALUES [('2025-01-01'), ('2025-02-01')),
PARTITION p202502 VALUES [('2025-02-01'), ('2025-03-01'))
)
DISTRIBUTED BY HASH(store_id) BUCKETS 8
PROPERTIES (
"replication_num" = "2",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.start" = "-6",
"dynamic_partition.end" = "3"
);
解读:
- DUPLICATE KEY:允许重复行,适合日志型数据。
- 按sale_date范围分区:每个月一个分区,查询时只扫相关月份。
- 按store_id哈希分桶:同一个门店的数据落在一个桶里,关联查询贼快。
- 动态分区属性:自动创建未来3个月分区,保留最近6个月数据。
在JVS-智能BI里,你不需要手写SQL,界面选两个分区键,系统自动生成。
三、动态分桶:让分桶数自己“长大”
固定分桶的坑:
- 数据少时分桶多 → 一堆小文件,查询慢。
- 数据多时分桶少 → 并行度不够,查询也慢。
Doris 1.2+支持动态分桶,在表属性里加:
"dynamic_partition.buckets" = "auto"
系统会根据数据量自动算分桶数:max(1, floor(数据量GB / 10)),上限64。
JVS-智能BI中勾选「自动优化分桶数」,系统每天凌晨自动调整。你只需在监控里看一眼SHOW DATA,如果某个分桶比其他大3倍以上,说明分桶键不够散(比如store_id分布不均),改成store_id+product_id组合键就好了。
四、分区自动化:不用再半夜起来建分区
JVS-智能BI集成了Doris的动态分区能力:
- 自动创建未来3个月的分区。
- 自动删除6个月前的旧分区。
- 界面可调保留策略。
五、踩过的坑,你千万别再踩
坑1: 分区键只按时间,但查询经常按门店过滤 → 跨分区扫全表。解决:把门店字段也放进二级分区键。
坑2: 分桶键用了低基数字段(比如只有10个门店) → 数据严重倾斜。解决:改用高基数字段或组合键。
坑3: 动态分区时区不对,分区边界差8小时。解决:Doris配置里加 timezone = Asia/Shanghai。
坑4: 表建好后发现分桶数不合适。解决:执行 ALTER TABLE ... MODIFY DISTRIBUTION BUCKETS = auto 在线调整,不丢数据。
六、总结
Doris的二级分区+动态分桶让数据仓库的维护变得“自动驾驶”。JVS-智能BI把这套能力封装成可视化配置,用户不用写一句Doris语法就能享受高性能。如果你也在选型OLAP,不妨试试这套组合拳。
你在用Doris或ClickHouse时遇到过哪些分区/分桶的坑?评论区分享出来,大家一起避雷。