分区
在 StarRocks 中进行快速分析始于与您的查询模式匹配的表布局。 本指南将实践经验提炼为关于分区的清晰规则,帮助您
- 通过积极的分区裁剪扫描更少的数据
- 使用仅元数据的操作管理生命周期任务(TTL、GDPR 删除、分层)
- 随着租户数量、数据量或保留窗口的增长平稳扩展。
- 受控写入放大——新数据落在“热”分区中;压缩发生在历史分区中
在对新表进行建模或重构旧表时,请密切关注此建议——每个部分都提供了目标驱动的标准、设计启发法和操作防护栏,以便您避免以后进行代价高昂的重新分区。
分区与分桶——不同的任务
在设计高性能 StarRocks 表时,理解分区和分桶之间的区别至关重要。 虽然两者都有助于管理大型数据集,但它们服务于不同的目的
- 分区允许 StarRocks 在查询时使用分区裁剪跳过整个数据块,并启用仅元数据的生命周期操作,例如删除旧数据或特定于租户的数据。
- 另一方面,分桶有助于在平板电脑之间分配数据,以并行化查询执行并平衡负载,尤其是在与哈希函数结合使用时。
方面 | 分区 | 分桶(哈希/随机) |
---|---|---|
主要目标 | 粗粒度数据裁剪和生命周期控制(TTL、归档)。 | 每个分区内的细粒度并行性和数据局部性。 |
计划器可见性 | 分区是目录对象; FE 可以通过谓词跳过它们。 | 只有相等谓词支持存储桶裁剪 |
生命周期操作 | DROP PARTITION 仅是元数据操作——非常适合 GDPR 删除、每月滚动。 | 无法删除存储桶; 它们仅通过 ALTER TABLE … MODIFY DISTRIBUTED BY 更改。 |
典型计数 | 每个表 10^2–10^4(天、周、租户)。 | 每个分区 10–120; StarRocks BUCKETS AUTO 调整此值。 |
倾斜处理 | 合并或拆分分区; 考虑复合/混合方案。 | 增加存储桶计数,散列复合键,隔离“鲸鱼”,或使用随机分桶 |
危险信号 | >100 k 个分区可能会为 FE 引入大量的内存占用 | 每个 BE >200 k 个平板电脑; 超过 10 GB 的平板电脑可能会遇到压缩问题。 |
我应该何时分区?
表类型 | 分区? | 典型键 |
---|---|---|
事实/事件流 | 是 | 是 |
巨大的维度(数十亿行) | 有时 | 时间和业务密钥更改日期 |
小尺寸/查找 | 否 | 依赖哈希分布 |
选择分区键
- 时间优先默认——如果 80% 的查询包含时间过滤器,请以
date_trunc('day', dt)
开头。 - 租户隔离——当您需要以租户为基础管理数据时,将
tenant_id
添加到键中 - 保留对齐——将您计划清除的列放入键中。
- 复合键:
PARTITION BY (tenant_id, date_trunc('day', dt))
完美裁剪,但会创建#tenants × #days
分区。 保持在 ≈ 100 k 以下,否则 FE 内存和 BE 压缩会受到影响。
选择粒度
PARTITION BY date_trunc('day', dt)
的粒度应根据用例进行调整。 您可以使用“hour”、“day”或“month”等。 请参阅 date_trunc
粒度 | 何时使用 | 优点 | 缺点 |
---|---|---|---|
每日(默认) | 大多数 BI 和报告 | 分区少(365/年); 简单的 TTL | 对于“最后 3 小时”查询不太精确 |
每小时 | > 2 × 每天的平板电脑; 物联网突发 | 热点隔离; 每天 24 个分区 | 8 700 个分区/年 |
每周/每月 | 历史档案 | 微小的元数据; 合并容易 | 更粗略的修剪 |
- 经验法则:保持每个分区 ≤ 100 GB 和 ≤ 每个分区 20 k 个平板电脑(跨副本)。
- 混合粒度:从 3.4 版本开始,StarRocks 支持通过将历史分区合并为更粗粒度来混合粒度。
示例配方
点击流事实(单租户)
CREATE TABLE click_stream (
user_id BIGINT,
event_time DATETIME,
url STRING,
...
)
DUPLICATE KEY(user_id, event_time)
PARTITION BY (date_trunc('day', event_time))
DISTRIBUTED BY HASH(user_id) BUCKETS AUTO;
SaaS 指标(多租户,模式 A)
推荐用于大多数 SaaS 工作负载。 按时间修剪,保持租户行共存。
CREATE TABLE metrics (
tenant_id INT,
dt DATETIME,
metric_name STRING,
v DOUBLE
)
PRIMARY KEY(tenant_id, dt, metric_name)
PARTITION BY date_trunc('DAY', dt)
DISTRIBUTED BY HASH(tenant_id) BUCKETS AUTO;
鲸鱼租户复合(模式 B)
当需要租户特定的 DML/DDL 或存在大规模租户时,请注意潜在的分区爆炸。
CREATE TABLE activity (
tenant_id INT,
dt DATETIME,
id BIGINT,
....
)
DUPLICATE KEY(dt, id)
PARTITION BY (tenant_id, date_trunc('MONTH', dt))
DISTRIBUTED BY HASH(id) BUCKETS AUTO;