StarRocks 深入
概述
StarRocks 是高性能 MPP OLAP 数据库(Doris 分叉演进而来),以极速查询、高并发、多表 Join 著称,支持存算分离与实时更新。本文讲透存算一体/分离架构、CBO 优化器、主键模型、物化视图与 Flink/Spark 集成。
一、StarRocks 定位
| 特性 | 说明 |
|---|---|
| 类型 | MPP OLAP |
| 架构 | FE + BE |
| 特点 | 高并发、强 Join、实时更新 |
| 模型 | 明细/聚合/更新/主键 |
| 适用 | 实时报表、高并发分析 |
| 与 Doris 关系 | 说明 |
|---|---|
| 同源 | 均源自百度 Palo |
| 演进 | StarRocks 独立发展 |
| 差异 | 性能与存算分离 |
二、存算一体 vs 存算分离
2.1 存算一体
BE 节点 = 计算 + 本地存储
数据本地、IO 快
扩展需同时扩存储计算| 优点 | 缺点 |
|---|---|
| IO 快 | 扩展耦合 |
| 部署简单 | 存储利用率低 |
2.2 存算分离
BE 计算 + 对象存储(S3/OSS)
数据在对象存储,计算弹性| 优点 | 缺点 |
|---|---|
| 弹性扩算 | 网络 IO |
| 存储廉价 | 冷热分层 |
| 云原生 | 按需扩展 |
2.3 选型
| 场景 | 模式 |
|---|---|
| 高性能本地 | 存算一体 |
| 云上弹性 | 存算分离 |
| 大存储小计算 | 分离 |
| 低延迟 | 一体 |
StarRocks 3.x 支持两种模式共存三、CBO 优化器
3.1 作用
基于代价(Cost-Based)优化:
统计信息 → 生成最优执行计划| 优化 | 说明 |
|---|---|
| 谓词下推 | 提前过滤 |
| Join 重排 | 最优顺序 |
| Runtime Filter | 运行时过滤 |
| 物化视图匹配 | 自动命中 |
| 分区裁剪 | 减少扫描 |
3.2 统计信息
列统计:行数、基数、分布
自动收集 / 手动 ANALYZECBO 收益:
复杂查询自动选择最优路径四、数据模型
4.1 模型类型
| 模型 | 特点 | 适用 |
|---|---|---|
| Duplicate | 全量明细 | 明细查询 |
| Aggregate | 预聚合 | 汇总 |
| Unique | 主键唯一 | 最新状态 |
| Primary Key | 强更新 | 实时更新 |
4.2 主键模型
sql
CREATE TABLE orders (
order_id BIGINT PRIMARY KEY,
status VARCHAR(20),
amount DECIMAL(12,2),
updated_at DATETIME
) DISTRIBUTED BY HASH(order_id) BUCKETS 16;| 特性 | 说明 |
|---|---|
| 更新 | 主键级实时更新 |
| 删除 | 支持 |
| 适用 | CDC 实时同步 |
| 性能 | 快(主键索引) |
4.3 主键模型注意
| 注意 | 说明 |
|---|---|
| 主键高基 | 影响内存 |
| 频繁更新 | 保证流写入 |
| 与 Unique 差异 | 更新机制更强 |
五、物化视图
5.1 作用
预计算聚合/Join:
查询自动命中 → 加速sql
CREATE MATERIALIZED VIEW mv_city_gmv AS
SELECT city, order_date, SUM(amount) AS gmv
FROM orders GROUP BY city, order_date;5.2 自动刷新
| 刷新 | 说明 |
|---|---|
| 同步刷新 | 数据变更即刷新 |
| 异步刷新 | 定时刷新 |
| 物化匹配 | 查询自动选择 |
| 优势 | 说明 |
|---|---|
| 透明 | 优化器选择 |
| 实时 | 同步刷新 |
| 多表 | 支持 Join 物化 |
六、Join 优化
6.1 Join 策略
| 策略 | 说明 |
|---|---|
| Colocate Join | 分桶一致本地 Join |
| Bucket Shuffle Join | 桶间数据转发 |
| Broadcast Join | 小表广播 |
| Runtime Filter | 动态过滤 |
CBO 自动选择最优 Join 方式6.2 优化建议
| 建议 | 说明 |
|---|---|
| 分桶键一致 | Colocate |
| 小表 | Broadcast |
| 大表 | 分桶并行 |
七、Flink / Spark 集成
7.1 Flink 集成
sql
-- Flink SQL 写 StarRocks
CREATE TABLE sr_sink (
order_id BIGINT,
amount DECIMAL(12,2)
) WITH (
'connector' = 'starrocks',
'fenodes' = 'fe:8030',
'table.identifier' = 'db.orders',
'sink.label-prefix' = 'flink',
'sink.properties.format' = 'json'
);
INSERT INTO sr_sink SELECT ... FROM source;| 特性 | 说明 |
|---|---|
| 实时写入 | 流式 |
| 主键更新 | Primary Key 模型 |
| 精确一次 | label 幂等 |
7.2 Spark 集成
Spark Connector:
批量读写 StarRocks
用于离线加工| 场景 | 引擎 |
|---|---|
| 实时入仓 | Flink |
| 离线批量 | Spark |
| 查询 | 直接 SQL |
八、高并发与扩展
8.1 高并发
并发能力:
主键点查(实时场景)
预聚合 + 物化视图
列式 + 向量化| 手段 | 说明 |
|---|---|
| 物化视图 | 减少计算 |
| 缓存 | 结果缓存 |
| 分区裁剪 | 减少扫描 |
8.2 扩展
FE 扩展:元数据高可用
BE 扩展:计算/存储
存算分离:弹性计算九、适用场景
| 场景 | 说明 |
|---|---|
| 实时报表 | 主键 + 物化 |
| 高并发分析 | 并发强 |
| 大宽表 Join | 多表关联 |
| 实时数仓 | Flink 集成 |
| 云原生 | 存算分离 |
常见问题速查
| 问题 | 原因与处理 |
|---|---|
| 更新慢 | 检查主键模型与写入 |
| Join 慢 | Colocate/广播 |
| 物化不命中 | 检查查询模式 |
| 存算分离慢 | 网络/缓存 |
| 并发低 | 物化/缓存/扩展 |