分区
在 StarRocks 中,实现快速分析的第一步是设计一个与查询模式相匹配的表布局。本指南将实践经验提炼为清晰的分区规则,帮助您:
- 通过积极的分区裁剪减少扫描数据量
- 使用仅元数据操作管理生命周期任务(TTL、GDPR 删除、分层存储)
- 随着租户数量、数据量或保留窗口的增长平稳扩展
- 控制写放大——新数据进入“热”分区;数据Compaction发生在历史分区中
在建模新表或重构旧表时,请牢记这些建议——每个部分都提供目标导向的标准、设计启发和操作防护措施,以避免将来进行代价高昂的重新分区。
分区与分桶——不同的任务
在设计高性能的 StarRocks 表时,理解分区和分桶之间的区别是至关重要的。虽然两者都有助于管理大型数据集,但它们的用途不同:
- 分区允许 StarRocks 在查询时通过分区裁剪跳过整个分区,并启用仅元数据的生命周期操作,如删除旧数据或特定租户的数据。
- 分桶则有助于将数据分布在多个 tablet 上,以并行化查询执行和均衡负载,特别是在与哈希函数结合使用时。
| 方面 | 分区 | 分桶(哈希/随机) |
|---|---|---|
| 主要目标 | 粗粒度的数据裁剪和生命周期控制(TTL、归档)。 | 细粒度的并行度和每个分区内的数据局部性。 |
| 计划器可见性 | 分区是 catalog 对象;FE 可以通过谓词跳过它们。 | 仅等值谓词支持分桶裁剪 |
| 生命周期操作 | DROP PARTITION 是仅元数据操作——理想用于 GDPR 删除、每月滚动。 | 桶不能被删除;它们仅通过 ALTER TABLE … MODIFY DISTRIBUTED BY 更改。 |
| 典型数量 | 每个表 10^2–10^4(天、周、租户)。 | 每个分区 10–120;StarRocks BUCKETS xxx 调整此值。 |
| 倾斜处理 | 合并或拆分分区;考虑复合/混合方案。 | 提高桶数量,哈希复合键,隔离“大租户”,或使用随机分桶 |
| 警示信号 | > 100k 分区可能会给 FE 带来显著的内存开销 | > 200k tablet/BE;单个 tablet 超过 10 GB 可能遇到Compaction问题。 |
什么时候应该分区?
| 表模型 | 分区? | 典型键 |
|---|---|---|
| 事实/事件流 | 是 | date_trunc('day', event_time) |
| 大型维度(数十亿行) | 有时 | 时间或业务键变更日期 |
| 小型维度/查找 | 否 | 依赖哈希分布 |