跳到主要内容
版本: 最新版本-3.5

分区

在 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 的平板电脑可能会遇到压缩问题。

我应该何时分区?

表类型分区?典型键
事实/事件流
巨大的维度(数十亿行)有时时间和业务密钥更改日期
小尺寸/查找依赖哈希分布

选择分区键

  1. 时间优先默认——如果 80% 的查询包含时间过滤器,请以 date_trunc('day', dt) 开头。
  2. 租户隔离——当您需要以租户为基础管理数据时,将 tenant_id 添加到键中
  3. 保留对齐——将您计划清除的列放入键中。
  4. 复合键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;