深入理解 StarRocks 的查询执行模型

深入理解 StarRocks 的查询执行模型

StarRocks 的查询执行过程可以类比为工厂的流水线生产,通过分层拆解实现高效并行处理。以下是分层解析:


1. 逻辑执行单元(Query Fragment)

本质:查询计划的逻辑分片
特点

  • 每个 Fragment 包含一组连续的计算算子(如 Scan→Filter→Aggregate)
  • 按照数据流向形成管道(Pipeline),类似工厂的装配线
  • 不同 Fragment 之间通过**数据交换(Exchange)**连接

示例

SELECT dept, AVG(salary) 
FROM employees 
WHERE hire_date > '2020-01-01' 
GROUP BY dept

会被拆分为:

Fragment 1: Scan(employees) → Filter(hire_date) → Local Aggregation
Fragment 2: Exchange → Global Aggregation

2. 物理执行单元(Pipeline Task)

本质:Fragment 的并行化实例
关键机制

  • 动态并行度:根据数据量和计算复杂度自动调整
    • Scan Fragment 可能启动 8 个 Task(数据量大)
    • Aggregate Fragment 可能只需 2 个 Task(计算密集)
  • 数据本地化:优先调度到存储对应数据的 BE 节点
  • 流水线执行:算子间通过内存管道传递数据,避免落盘

执行过程图示

[Fragment 1]                    [Fragment 2]
Task 1: Scan → Filter → Agg     Task 1: Final Agg
Task 2: Scan → Filter → Agg     (并行度更低)
Task 3: Scan → Filter → Agg

3. 为什么需要分层设计?
设计层级 解决的问题 类比
逻辑 Fragment 计算逻辑的正确性 工厂的工艺图纸
物理 Task 资源利用与并行效率 车间生产线工位

实际优化案例

  • Join 场景:大表Join时,构建表(Build Side)用较少Task处理,探测表(Probe Side)用高并行度
  • 聚合场景:两阶段聚合(Local+Global)中,Local阶段并行度更高

4. 开发者需要关注什么?
  1. 执行计划分析

    EXPLAIN SELECT ...; -- 查看Fragment划分
    EXPLAIN ANALYZE SELECT ...; -- 查看实际并行度
    
  2. 参数调优

    SET parallel_fragment_exec_instance_num = 8; -- 控制默认并行度
    SET pipeline_dop = 4; -- 算子并发度
    
  3. 资源限制

    SET exec_mem_limit = '8G'; -- 单个Task内存限制
    

5. 技术实现关键点
  • 调度器:采用 Push-Based 调度模式,BE 主动拉取 Task
  • 容错机制:单个 Task 失败会自动重试(通过重放上游数据)
  • 资源隔离:每个 Task 有独立的内存预算和 CPU 时间片

这种架构使得 StarRocks 既能处理简单的点查询(少量Fragment),也能高效执行复杂的分析查询(多层Fragment并行)。理解这一点对性能调优至关重要。

你可能感兴趣的:(starrocks,前端,数据库,大数据)