Doris 的向量化執行能力與其?分布式架構?和?復雜查詢優化?深度結合,通過?批處理 + 列式計算 + 分布式調度?的協同設計,解決傳統分布式數據庫在復雜查詢場景下的性能瓶頸。以下是具體原理展開:
一、向量化如何適配分布式架構?
Doris 的分布式架構(MPP)天然依賴數據分片和并行計算,而向量化通過以下機制與其深度協同:
1.?數據分片與批處理的結合
-
數據分片存儲:數據按分區、分桶規則分布在不同節點,每個分片(Tablet)內部數據按列存儲。
-
向量化批處理單元:每個節點在處理分片數據時,以固定大小的數據塊(如4096行)為單位加載到內存,按列批量處理。
-
優勢:
-
減少跨節點網絡傳輸次數(批量傳輸代替逐行傳輸)。
-
單節點內利用 CPU 緩存局部性,減少內存隨機訪問。
-
2.?分布式任務的向量化調度
-
Pipeline 并行執行:將查詢拆分為多個階段(Scan、Filter、Join、Aggregation),每個階段以向量化批次為單位處理,形成流水線。
-
動態資源分配:根據數據批次的處理速度,動態調整節點間的任務分配,避免單個節點成為瓶頸。
-
示例:
一個聚合查詢會拆分為:復制
掃描分片數據(向量化批次)→ 過濾(按列批量計算)→ 網絡傳輸聚合中間結果(按批次壓縮)→ 全局聚合(向量化計算)
3.?網絡傳輸優化
-
列式壓縮傳輸:數據在節點間傳輸時,按列進行壓縮(如字典編碼、RLE),減少網絡帶寬占用。
-
批處理傳輸:單次傳輸一個數據塊(如4096行),而非逐行傳輸,降低序列化/反序列化開銷。
二、向量化如何優化復雜查詢?
復雜查詢(如多表 JOIN、子查詢、窗口函數)需要大量中間計算和內存操作,Doris 的向量化通過以下方式優化:
1.?列式計算減少冗余開銷
-
按列批量處理:在 JOIN 或聚合時,直接操作整列數據,避免逐行解析字段。
-
內存連續訪問:列式數據在內存中連續存儲,結合 SIMD 指令(如 AVX-512)加速計算。
例如:計算?WHERE age > 30
,直接對整列?age
?數據批量比較。
2.?動態優化執行計劃
-
運行時過濾下推:在向量化處理過程中,動態將過濾條件(如 Bloom Filter)下推到掃描層,提前減少需處理的數據量。
-
JOIN 順序調整:根據實時統計信息(如中間結果的數據量),動態選擇最優的 JOIN 順序,減少中間數據集大小。
3.?高效內存管理
-
批處理內存池:為每個批次分配連續內存空間,減少內存碎片。
-
延遲物化:在數據流轉過程中,盡量保留列式結構,僅在實際需要時轉換為行格式(如最終輸出結果)。
4.?復雜算子優化
-
向量化 JOIN:
-
使用 Hash Join 時,批量構建哈希表,按批次匹配右表數據。
-
支持 Broadcast Join 和 Shuffle Join,按數據分布選擇最優策略。
-
-
向量化聚合:
-
聚合操作(如 SUM、GROUP BY)直接對列數據批量計算,利用 SIMD 加速。
-
支持兩級聚合(本地聚合 + 全局聚合),減少數據傳輸量。
-
5.?預聚合與物化視圖
-
預計算加速:通過物化視圖提前按維度聚合數據,查詢時直接命中預聚合結果(按列批量讀取)。
-
動態分區裁剪:利用元數據統計信息,跳過無需掃描的分區(如時間范圍過濾)。
三、對比非向量化的分布式數據庫
若 Doris 不使用向量化執行,在復雜查詢場景下會面臨以下問題:
-
CPU 利用率低:逐行處理導致大量分支預測失敗,無法利用 SIMD 指令。
-
網絡開銷大:逐行傳輸數據增加序列化成本和網絡往返次數。
-
內存壓力大:中間結果逐行生成,占用更多內存且緩存不友好。
總結:Doris 向量化與分布式架構的協同效應
設計機制 | 解決的問題 | 性能提升 |
---|---|---|
列式批處理 + 內存連續訪問 | 減少 CPU 分支預測失敗、緩存失效 | 單節點計算效率提升 3-5 倍 |
流水線并行 + 動態調度 | 避免節點空閑等待,提升集群利用率 | 復雜查詢延遲降低 50% 以上 |
列式壓縮傳輸 | 減少網絡帶寬占用 | 網絡傳輸開銷減少 60%-80% |
預聚合 + 動態過濾下推 | 減少冗余數據處理 | 掃描數據量降低 90%(依賴查詢模式) |
通俗類比
想象一個快遞倉庫(Doris 集群):
-
非向量化:工人(CPU)每次處理一個包裹(單行數據),頻繁往返倉庫和卡車(網絡傳輸),效率低下。
-
向量化:工人使用大型集裝箱(批量數據塊),用叉車(SIMD 指令)一次性搬運多個包裹,同時倉庫調度系統(分布式優化)動態規劃最優路線,最終大幅提升吞吐量。