【StarRocks系列】查询语句执行全流程
目录
StarRocks 查询数据流程详解
1. 提交查询语句
2. FE 解析与优化
3. 选择 BE 节点与数据路由
4. BE 数据读取与计算
5. 结果返回
关键优化点总结
示例流程
流程图
StarRocks 查询数据流程详解
StarRocks 采用分布式 MPP 架构,查询流程涉及 FE(Frontend) 和 BE(Backend) 协同工作,核心流程如下:
1. 提交查询语句
- 客户端(如 MySQL Client/JDBC)向任意 FE 节点发送 SQL 请求。
- FE 接收请求后,进入解析阶段。
2. FE 解析与优化
步骤分解:
- SQL 解析与语法校验
-
- FE 的 Parser 将 SQL 解析为抽象语法树(AST)。
- 校验语法、表/列是否存在、权限等。
- 逻辑计划生成
-
- 将 AST 转换为逻辑计划(Logical Plan),明确操作顺序(如 Scan、Filter、Join、Aggregate)。
- 优化器处理
-
- CBO(Cost-Based Optimizer) 基于统计信息(表大小、列基数等)优化逻辑计划:
-
-
- 谓词下推(Predicate Pushdown)
- Join 重排序(Join Reorder)
- 选择最优聚合策略(单阶段/两阶段聚合)
-
-
- 输出 最优物理执行计划。
- 分布式计划拆分
-
- 将物理计划拆分为多个 Fragment(并行执行单元),每个 Fragment 包含:
-
-
- Scan 节点(数据扫描)
- Compute 节点(计算操作)
- Exchange 节点(跨节点数据传输)。
-
3. 选择 BE 节点与数据路由
- 数据本地性优先:
FE 根据 分区分桶信息 选择存储目标数据的 BE 节点,优先调度到数据所在的 BE 执行(减少网络传输)。 - 分区分桶剪枝:
-
- 分区剪枝(Partition Pruning):
根据WHERE
条件过滤无关分区(如日期分区)。 - 分桶剪枝(Bucket Pruning):
根据分桶键(如user_id
)的哈希值定位目标分桶(Tablet)。
- 分区剪枝(Partition Pruning):
4. BE 数据读取与计算
BE 节点执行流程:
- 索引加速过滤
-
- 前缀索引(Short Key Index):
每 1024 行生成一个索引项,通过前缀快速定位数据块。 - 布隆过滤器(Bloom Filter):
对高基数列(如user_id
)快速过滤不满足条件的数据块。 - 位图索引(Bitmap Index):
低基数列(如gender
)的等值过滤加速。
- 前缀索引(Short Key Index):
- 列式读取与向量化计算
-
- 按列读取数据(OLAP 场景友好),利用 SIMD 指令 进行向量化计算。
- 执行过滤(
WHERE
)、聚合(GROUP BY
)、连接(JOIN
)等操作。
- 多阶段聚合
-
- 两阶段聚合示例:
-
-
- Local Aggregation:BE 节点本地预聚合。
- Global Aggregation:汇总所有 BE 的中间结果,生成最终聚合值。
-
- 数据交换(Exchange)
-
- 若需跨节点计算(如 Shuffle Join),BE 通过 Exchange 节点 传输数据。
5. 结果返回
- 结果汇总:
最终结果由某个 BE 或 FE 汇总(取决于查询类型)。 - 返回客户端:
FE 将结果集返回给客户端。
关键优化点总结
阶段 | 优化技术 | 目的 |
FE 解析 | CBO 优化、谓词下推 | 减少计算量和数据传输 |
路由 | 分区分桶剪枝 | 减少扫描数据量 |
BE 读取 | 前缀索引 + Bloom Filter + 向量化计算 | 加速过滤与计算 |
分布式计算 | 本地化优先 + 两阶段聚合 | 降低网络开销,提升并行效率 |
示例流程
SELECT user_id, SUM(amount)
FROM orders
WHERE date = '2023-10-01' AND product_id = 100
GROUP BY user_id;
- FE 解析 SQL,剪枝
date='2023-10-01'
的分区,定位product_id=100
的分桶。 - FE 生成计划:每个 BE 扫描本地分桶 → 本地聚合 → 结果汇总到 Leader BE 做全局聚合。
- BE 利用前缀索引快速定位数据块,Bloom Filter 过滤
product_id=100
的行。 - 结果返回客户端。
通过以上流程,StarRocks 实现高性能分布式查询,适合大规模数据分析场景。