Apache Cloudberry 向量化實踐(三)重塑表達式構建路徑:Gandiva 優化實戰

在向量化執行系統中,表達式構建是不可或缺的基礎環節。無論是 SQL 中的投影、篩選,還是分區、聚合、排序,最終都需轉化為底層執行引擎能識別和執行的表達式樹。而在 Apache Cloudberry 向量化執行框架中,這一過程由 Gandiva 表達式引擎負責完成。
隨著數據規模與查詢復雜度的提升,我們逐漸意識到,表達式構建本身正成為影響執行性能的關鍵路徑之一。特別是在高并發、多表達式拼接的場景下,構建過程的性能瓶頸愈加突出。本文將結合實際優化案例,分享我們如何識別問題、設計優化方案,并用火焰圖驗證成效。

為何選 Gandiva?JIT + Arrow 的組合拳
Gandiva 是 Apache Arrow 項目中的子模塊,它基于 LLVM 構建 JIT 編譯能力,專為高性能、批量化的列式計算而設計。我們選擇 Gandiva 作為表達式引擎的主要原因有三點:

  1. 向量化執行友好:Gandiva 表達式以 Arrow RecordBatch 為輸入/輸出單位,與 Cloudberry 的內存格式完全兼容,避免額外序列化/反序列化開銷。
  2. JIT 編譯能力強:Gandiva 支持將表達式編譯為本地機器碼,執行效率顯著優于解釋執行。
  3. 表達式樹抽象清晰:其表達式結構基于語法樹(AST),便于分析、合并、轉換、優化。
    但“強大”背后也隱藏著一個問題:表達式構建過程并非“零成本”,尤其在表達式數量和深度快速增長時,構建開銷成為了不容忽視的負擔。

原始構建路徑的問題:節點重復 & 樹結構過深
在未優化前,我們采用“逐表達式構建”的方式——每處理一條 SQL 表達式,就從頭創建一棵新的表達式樹。這種策略在簡單查詢下運行良好,但在復雜嵌套查詢、窗口函數、聯表計算等場景下暴露出以下問題:

  1. 公共子表達式重復構建:同一表達式片段(如 lower(colA))在不同上下文中多次出現時,每次都重新生成節點,造成冗余。
  2. 表達式樹結構深且復雜:表達式鏈條變長時,嵌套層級加深,構建耗時近似呈線性增長。
  3. Hash 邏輯不穩定:相同表達式結構,由于構建路徑差異導致節點 hash 不一致,影響緩存和優化判斷。
    我們對典型查詢的表達式構建過程進行了耗時統計,結果顯示:
  • 在包含 20+ 表達式的復雜查詢中,表達式構建耗時占整體查詢時間的 10%~15%;
  • 其中約 40% 的表達式為可復用的子表達式,但未被有效識別與復用;
  • 構建階段的所有開銷幾乎全部集中在 on-CPU 路徑上,火焰圖顯示 CreateExpressionNode、ToArrowNode 等函數在 CPU 調用棧中占比極高,成為構建瓶頸的主要耗時點。
    這些現象表明:表達式構建過程不僅費時,而且浪費資源。

優化策略:公共子表達式識別 + 哈希原子化
我們采用兩項優化手段來重構表達式構建路徑:

  1. 公共子表達式識別(CSE)
    引入表達式 DAG 結構,在構建過程中為每個子表達式生成唯一 key(基于語義簽名),并放入全局表達式緩存池。后續若再次請求相同表達式,直接復用已有子樹。
  • 優點:減少冗余節點構建,降低構建深度;
  • 技術點:等價表達式歸一化(如 a + b vs b + a)、表達式 hash 去重。
  1. 哈希表達式原子化
    將每一個表達式節點封裝為具有確定性 hash 的原子單元,避免因構建路徑差異導致 hash 沖突。統一采用 結構 hash + 類型信息 + 參數簽名 的組合哈希策略,確保緩存命中率提升。
    優化后,我們實現了表達式構建路徑的“結構性去重”:從構建“樹”轉為拼裝“塊”,如搭積木般復用構建單元,降低系統負擔。

優化效果對比:結構簡化 & 構建耗時下降
通過對比優化前后在復雜 SQL 下的表達式構建過程,我們觀察到以下顯著變化:
在這里插入圖片描述

不僅節點數量明顯下降,構建時間也隨之降低了50%以上,特別是在復合查詢中表現尤為明顯。

火焰圖驗證:構建路徑 on-CPU 時間顯著下降
我們進一步通過 perf 工具配合火焰圖對比優化前后的 CPU 使用情況,焦點集中在表達式構建階段。
優化前的火焰圖中,Gandiva::TreeExprBuilder::MakeExpression() 及其內部調用占據主火焰圖的 30% 高度,顯著吞噬 on?CPU 資源。
優化后,火焰圖中該函數堆棧深度顯著縮減,僅占主圖不到 10%,并可見更多時間釋放給后續執行邏輯,如 Eval、Filter、Project 等。
這說明:表達式構建從 CPU 消耗的“主角”,退回到了其應有的“配角”角色。

表達式構建常被認為是“編譯期行為”,但在現代向量化系統中,它的性能表現直接影響執行鏈路的起跑速度。
通過本次優化,我們驗證了如下幾點:

  • 表達式構建本身具有顯著的優化空間;
  • 結構性去重 比單純加快構建速度更有效;
  • 可觀測性工具(如火焰圖) 是評估優化效果的關鍵利器。
    這也為后續優化其他執行環節(如重分布、調度、緩存)提供了經驗模板:先觀測,再定位,再結構重構。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88452.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88452.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88452.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows刪除文件或者拔出U盤顯示正在使用/占用解決辦法

1、復制文件地址2、打開任務管理器,選擇左側【性能】3、打開資源監視器4、選擇資源監視器中的CPU5、粘貼你復制的占用文件地址6、除了explore.exe以外,其他的關聯的句柄都選中,然后右鍵結束

自由學習記錄(68)

🧠 blender為什么不用 M 或 T? 鍵位含義為什么沒選MMove?其實被用作「Move to Collection」等功能不符合歷史定義,而且功能太多了TTransform? 但 transform 是一個總稱(含移動、旋轉、縮放)T 被…

ReactNative【實戰系列教程】我的小紅書 8 -- 我(含左側彈窗菜單,右下角圖標等)

最終效果點左上角菜單按鈕,彈出左側菜單后代碼實現app/(tabs)/mine.tsx import icon_add from "/assets/icons/icon_add.png"; import mine_bg from "/assets/images/mine_bg.png"; import Heart from "/components/Heart"; import a…

C++性能優化實戰:從理論到落地的五大核心策略

在當今這個對計算效率要求極高的時代,C作為系統級編程語言的王者,其性能優化能力依然是無可替代的核心競爭力。本文將分享我在大型分布式系統開發中積累的C性能優化實戰經驗,這些經驗幫助我們將關鍵組件的吞吐量提升了300%,延遲降…

字節 Seed 團隊聯合清華大學智能產業研究院開源 MemAgent: 基于多輪對話強化學習記憶代理的長文本大語言模型重構

🔥 最新動態!!! [2025/07] 我們提供了快速啟動腳本,讓使用MemAgent變得超級簡單,詳情請見下方"快速入門"部分。[2025/06] 我們發布了RL-MemAgent-14B和RL-MemAgent-7B模型,在350萬token上下文任務中實現了近乎無損的性…

【unitrix】 4.20 類型級二進制數減法實現解析(sub.rs)

一、源碼 這段代碼實現了一個用于統計二進制補碼整數位數的系統,支持多種自定義數值類型(Z0、P1、N1、B0、B1)。 use core::mem::size_of; use crate::number::{Z0, P1, N1, B0, B1, Var};/// 統計二進制位數的 trait pub trait BitLength {f…

手把手教你安全刪除Anaconda虛擬環境(避坑指南)

文章目錄一、刪除前必看清單(超級重要)二、三種刪除方法對比(建議收藏)方法1:官方推薦命令(最安全)方法2:暴力刪除大法(快速但需謹慎)方法3:核彈級…

Effective Modern C++ 條款7:區分使用 `()` 和 `{}` 創建對象

在 C11 及以后的版本中,初始化對象的方式變得更加靈活,但也帶來了選擇上的困惑。() 和 {} 是兩種常見的初始化語法,它們在語義、行為和適用場景上有顯著差異。本文將通過具體示例,深入解析這兩種初始化方式的區別,并探…

Java基礎-String常用的方法

String常用的三種構造方法 public static void main(String[] args) {//1.使用常量字符串構造String s1 "1.Hello world";System.out.println(s1);//2.使用new關鍵字構造String s2 new String("2.Hello world");System.out.println(s2);//3。使用字符數組…

數學建模:多目標規劃:ε約束法、 理想點法

一、ε約束法定義ε約束法通過將部分目標函數轉化為約束條件,保留一個主要目標進行優化。1、選擇一個主要目標 fk?(x) 進行優化。2、其他目標 fi?(x) 轉化為約束 fi?(x)≤εi?,其中 εi? 是決策者設定的容許閾值。??原理????目標選擇??&…

linux kernel struct regmap_config結構詳解

在 Linux 內核中,struct regmap_config 是 ?Regmap 子系統的核心配置結構體,用于定義如何與底層硬件寄存器進行交互。Regmap(Register Map)子系統通過抽象不同總線(如 I2C、SPI、MMIO 等)的寄存器訪問細節…

【Python3教程】Python3高級篇之CGI編程

博主介紹:?全網粉絲23W+,CSDN博客專家、Java領域優質創作者,掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java技術領域? 技術范圍:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大數據、物聯網、機器學習等設計與開發。 感興趣的可…

docker安裝Consul筆記

安裝過程 詳細步驟如下: 首先拉取Consul的Docker鏡像: docker pull hashicorp/consul:1.18.1創建Consul的配置文件和數據目錄: mkdir -p /srv/docker/consul/data mkdir -p /srv/docker/consul/config在config目錄下創建一個config.json配置文…

.net數據脫敏

.NET數據脫敏技術:保障數據安全的有效手段 在當今數字化時代,數據安全至關重要。尤其是涉及到用戶的敏感信息,如密碼、手機號碼等,必須采取有效的措施進行保護。數據脫敏就是這樣一種技術,它能夠在不影響數據可用性的…

【openp2p】 學習2:源碼閱讀P2PNetwork和P2PTunnel

【openp2p】 學習1:P2PApp和優秀的go跨平臺項目已經做了初步分析。閱讀原版工程,感覺工程是一個暴露內網服務端口,讓外部可以用的一個實現是一個完整的、跨平臺的可商業化的應用。感謝作者需要學習作者的設計思路工程構建 F:\GolandProjects\openp2p\core\p2pnetwork.go通常…

網安學習NO.14

防火墻基礎實驗 傳統防火墻配置實驗拓撲圖PC: ip 192.168.10.1 255.255.255.0 192.168.10.254 ip dns 114.114.114.114二層交換機 vl 10 ex int e0/0 sw mo ac sw ac vl 10 ex inr e0/1 sw tr en do sw mo tr三層交換機 vl 10 ex int g0/0 sw tr en do sw mo tr ex …

ESP32語音喚醒

兩種喚醒方式AfeWakeWord與EspWakeWord對比 底層技術 AfeWakeWord:基于ESP-IDF的AFE框架(esp_afe_sr_iface_t),高性能模式(AFE_MODE_HIGH_PERF)EspWakeWord:基于WakeNet接口(esp_wn_…

借助 Wisdom SSH AI 助手,輕松安裝 CentOS 8 LNMP 環境

打開Wisdom SSH軟件,在AI對話區輸入“在CentOS 8服務器安裝LNMP環境”,AI助手會按以下步驟分析并執行安裝: 安裝Nginx 分析:CentOS 8默認軟件源可能沒有Nginx,所以要先啟用Nginx官方軟件源,然后才能安裝Ngi…

WD0407 40V 7A 超級肖特基二極管,應用于開關汽車工業控制

WD0407 40V 7A 超級肖特基二極管說明? 產品概述? WD0407 是一款性能卓越的超級肖特基二極管,專為滿足現代電子設備對高效、可靠電源管理的需求而設計。它采用先進的半導體制造工藝,在諸多關鍵性能指標上表現出色,能夠為各類電路提供穩定、高…

盧比危機下的金融破局:科倫坡交易所技術升級作戰圖

🌏 今日南亞風暴眼 印度雙重上市機制加速落地:印度國家證券國際交易所(NSE IX)與科倫坡證券交易所(CSE)達成技術對接協議,斯企可通過印度GIFT City吸引美元資本,交易時段覆蓋全球22小…