目錄
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 實現高性能分布式查詢,適合大規模數據分析場景。