StarRocks¶
Explanation · 原理资深
一句话定位 · 独立 MPP OLAP 数据库 · 湖仓可当加速层
现代 MPP 分析型数据库——完整数据库(有自己的存储 + 执行 + Catalog),可独立部署作 OLAP 栈;在湖仓环境下也常扮演"BI 加速层 / 仪表盘专用引擎"。向量化执行 + 物化视图 + 湖表直读。比 Trino 延迟更低,比 ClickHouse join 更强。
向量化 ≠ 向量检索 · 和 retrieval/ 章节的边界
StarRocks 3.3+(2024) 加了向量索引 + 向量检索函数(cosine/L2/inner product + HNSW)。注意区分:
- "向量化执行" = SIMD · 是 StarRocks 性能基础(本页正文主要讲这个)
- "向量检索" = ANN 相似度搜索 · 2024+ 向检索侧延伸——详见 多模检索
StarRocks 的向量检索定位:BI 数据表里附带向量列做混合查询(SQL 过滤 + ANN 排序)场景合适;纯向量工作负载仍建议 Milvus / LanceDB。
它解决什么 · "比 Trino 延迟更低 / 比 ClickHouse join 更强" 的前提¶
上面 tip 里那句高价值判断有严格前提,不补充容易变成口号:
| 判断 | 成立前提 |
|---|---|
| "比 Trino 延迟更低" | 仅限 已在 StarRocks 内表(本地存储)的数据 · 直读 Iceberg 外表时延迟和 Trino 同量级甚至更慢 |
| "比 ClickHouse join 更强" | 多表 join / shuffle join 场景;但单表大扫描仍是 ClickHouse 更快(ClickHouse MergeTree 的甜区不输 StarRocks 内表) |
| "高并发 BI p95 < 1s" | 数据已预聚合为 MV / 表设计合理(bucket / colocate join)· 不是所有 query 开箱即达 |
StarRocks 的甜区:
- 复杂多表 join(shuffle + colocate + bucket join 混合优化)
- 高并发(数百–数千 QPS)· **数据在内表 + 有合适 MV / 索引 **
- 毫秒到秒级延迟 · 前提同上
- 直接读 Iceberg / Hudi / Paimon / Delta 外表 · 秒级延迟,用于低频 / 探索场景(不是仪表盘主路径)
架构¶
flowchart LR
fe[FE (Frontend)<br/>元数据+调度] --> be1[BE (Backend)]
fe --> be2[BE]
fe --> be3[BE]
be1 -.-> obj[(对象存储<br/>湖表)]
be2 -.-> obj
be3 -.-> obj
be1 -.-> local[本地存储<br/>Primary Key 表]
两种表:
- Internal Table —— 数据放 BE 本地存储;Primary Key 表支持 upsert
- External Table / Catalog —— 直接读 Iceberg / Hudi / Paimon / Hive,不搬数据
关键能力¶
- 向量化执行 + SIMD
- 物化视图(MV) 跨外部 Catalog(可以把 Iceberg 表预聚合成 StarRocks MV 供 BI 查)
- Primary Key 表(upsert / delete)
- Colocate / Shuffle / Bucket join 优化
- 自适应并发控制
- Query Cache / Result Cache
在湖仓里的典型用法¶
两种模式:
模式 A:加速副本¶
BI 仪表盘查询打到 StarRocks,数据实体化进 StarRocks 本地存储:
- 从 Iceberg 周期性 refresh MV → StarRocks 内部表
- BI 打 StarRocks,响应毫秒级
- 两份数据,但查询速度换来了
模式 B:直读湖表¶
StarRocks 以 External Catalog 挂 Iceberg / Paimon,查询直接读对象存储:
- 无物化副本,一份数据
- 延迟比模式 A 高(秒级),但架构更简单
两种模式可并存:热查询走 A,冷/探索走 B。
湖仓直读 vs 加速副本 · 生产决策关键维度¶
| 维度 | 直读外表(模式 B) | 加速副本(模式 A · 内表 + MV) |
|---|---|---|
| 延迟 | 秒级(对象存储 I/O + 外部元数据) | 毫秒级(本地 + 预聚合) |
| 新鲜度 | 实时跟源表 snapshot | MV 刷新周期决定(通常分钟级) |
| 数据一致性 | 和源表强一致(读同一 snapshot) | MV 和源表有 lag · 上游 commit 后要等刷新 |
| 权限 | 依赖源 Catalog(Polaris / Glue 等) | 走 StarRocks 自己的 RBAC |
| schema 演化 | 读时感知源表 schema 变更 | MV 要手动 ALTER 或重建才跟上 |
| 成本 | 一份数据 · 对象存储 + 计算 | 两份数据 · 内表存储 + MV 刷新计算 |
| 适合 | 低频 / 探索 / 冷数据 | 仪表盘 / 热数据 / 高并发 |
最危险的误用:把直读外表当仪表盘主路径 · 延迟 / 并发上不去后以为是 StarRocks 不行;实际应该热路径走 MV 加速副本 · 冷路径走外表。
什么时候选¶
- BI / 仪表盘 p95 < 1s,高并发
- 复杂多表 join
- 湖仓 + OLAP 数仓"同一引擎服务两个场景"
什么时候不选¶
- ETL(选 Spark)
- 事件时间流(选 Flink)
- 单机探索(选 DuckDB)
陷阱与坑¶
- FE 单主:多 follower 但活跃主 1 个,切主时短暂不可用
- 物化视图刷新策略要和上游湖表的 commit 节奏配合
- 内部表 + 外部表双栈要理清治理:哪些是"权威"表、哪些是"加速"表
相关¶
- 同类:Apache Doris(前身同源)
- 场景:BI on Lake
- 查询加速
延伸阅读¶
- StarRocks docs: https://docs.starrocks.io/
- StarRocks: A New Open-Source Data Warehouse(官方白皮书)