從一到無窮大 #43:Presto History Based Optimizer,基于PlanNode粒度統計的查詢計劃選擇策略

在這里插入圖片描述本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

本作品 (李兆龍 博文, 由 李兆龍 創作),由 李兆龍 確認,轉載請注明版權。

文章目錄

  • 引言
  • Motivation
  • Architecture
  • HBO Scenario
  • Experiments
  • 結束語

引言

過年回家這件事在摯友的勸導下,在不回去和一直呆在家之間選擇了提前回深圳,從絕大多數方面看這絕對可以算是最近一段時間內做的最正確的決策之一,最直觀的結果就是擁有了完整三天個人假期,可以徹徹底底的放松下,提前進入下2025H1的項目攻堅狀態,把自己的心態拉回來。

過年期間并不算全部都是頹廢的生活,除去闔家團圓的傳統劇情,更具現實意義的是在摯友的推薦和自我興趣驅使下讀完了《親密關系》《惡意》《黃仁勛:英偉達之芯》《廊橋遺夢》,還有一本尚在 todo list 內的《信》,其實對于閱讀這件事情我一直很功利,這也是為什么之前只有在交通工具上時我才會讀非技術書,平時的大把時間也都是在讀領域相關的paper,但是慢慢的發覺,僅有領域知識是遠遠不夠解答所有的困惑的。

回到假期,深圳的三天除了正常的鍛煉,看朋友發給我的自媒體資料這兩個必做項之外,我一直想,在有限的剩余時間是輸入,輸出還是躺著?

輸出有三個選擇:

  1. 我非常想寫《黃仁勛:英偉達之芯》這本書的書評,雖然傳記類文章存在部分魔幻色彩,但是Jensen的經歷毋庸置疑是傳奇的,而且NVIDIA的崛起之路不夸張的講能讓一個癡迷技術的理工人看到顱內高潮,相比之下《騰訊傳》就顯得無趣多了。
  2. 我最近在做時序數據庫的MPP(Massively Parallel Processing),免不了需要去適配Exchange算子,也確實沒研究過其他的實現,但Velox中的實現的異步方式確實讓人耳目一新,其實現基于ExchangeQueueExchangeClientExchangeSources三個類,新的實現只需要繼承ExchangeSources就好,這里是絕對值得輸出的,且目前網上這里的資料是零。
  3. Presto的HBO,也就是本文,這篇paper年前就看完了,我其實看絕大多數paper不會寫文章,但這篇文章揭示了一個現象,其與我的工作有一些想法上的聯系,即越細的監控粒度能夠帶來更多的可能性,如果能持續下壓性能和成本,這就是絕對符合公司(部門)戰略的事情,而且我最近也在負責優化器部分的重構,HBO的思路有可能在做部分修改后應用到X-Stor來。長久以來看慣了很多軟文的宏大敘事,但其實絕大多數人做的事情就是沒有顛覆性價值,摳出一點意義已經是值得投入以年計的時間了,這雖然讓人有時覺得沮喪,無力且壓抑,但是耐心沉淀對于個人來講也是必要的,畢竟Jensen也曾在AMD打工。

輸入有兩個選擇:

  1. 把新年檔的哪吒,唐探,封神看下,事實上已經快忘了我上次在影院看電影是多少年前了
  2. 還有兩本書想看

躺著:

  1. 思考當下生活的核心矛盾點,思考未來想做好的事情,思考我真正想要的東西是什么

正如現在看到的這樣,最終的決策是選擇輸出HBO,如果文章寫完還有點剩下的時間,那就去深圳灣人才公園水池旁邊的草坪上躺著看星星。

Motivation

Presto的Cardinality Estimator依賴于如下統計信息,粒度為partition級別:

  1. Overall cardinality of the partition
  2. Column statitstics including
    1. Average size
    2. Number of distinct values
    3. Number of null values
    4. Range(min/max) for the values

傳統的CBO(Cost Based Optimizer)通常依靠離線過程收集有關輸入數據的統計信息,文章開篇點出CBO存在復雜查詢下Cardinality Estimation不準確的情況,進而導致查詢計劃的選擇無法達到最優,具體的,存在如下問題:

  1. 需要在查詢前執行分析
  2. 做出了很多Simplifying Assumptions,比如data uniformityindependence of filters and columns,在復雜表達式下通常無法準確預估Selectivity
  3. 使用更復雜的統計信息,比如multi-columnjoin histograms,但是需要額外的空間和時間,且很難處理,絕大多數系統沒有實現

LBO(Learning Based Optimizer)也是最近幾年比較火爆的一個方向,其最大的優勢是克服了傳統CBO的很多Simplifying Assumptions,但是也有如下缺點:

  1. 訓練和改進模型需要大量的投入
  2. 可解釋性差

HBO(History Based Optimizer) 在 Operator Node 級別統計 Query Execution Statistics,并使用這些數據來預測相似查詢的未來性能。HBO基于一種假設,即用戶查詢雖然復雜,但本質上是重復性的,一般使用使用模版生成相同結構的查詢,這會造成查詢計劃基本一致,進而可以通過簡易的方法找到之前的統計信息,然后用來執行精確的估計,這種假設從我們的經驗來看是對的。

HBO解決了之前無法解決的問題:

  1. Accuracy:在實際執行運行期間記錄統計數據,并在運算符級別進行跟蹤,消除了使用基礎表統計數據引入的較大估計誤差。
  2. Automation:每次查詢運行時,歷史記錄都由輕量級進程跟蹤,從而避免了采樣開銷或模型訓練。
  3. Adaptiveness:對基礎數據分布的更改會自動反映在跟蹤的歷史記錄中,并用于未來的優化。
  4. Explicability:用戶和 DBA 可以查看估計數據的來源以及它與實際值的差距。

Architecture

Presto CBO可以為簡單查詢生成準確的估計,但隨著查詢變得越來越復雜,誤差幅度會呈指數級增長。

HBO希望做到的約束如下:

  1. Estimates need to be accurate:解決復雜查詢下的基數估計不準的問題
  2. Accommodate changes to both data and queries:數據和查詢不是靜態的,但是一般也不會短時間存在巨大波動,HBO要能適應數據變化
  3. Minimal overhead to query processing:輕量級統計,無需大量計算
  4. Ease of use and operation:可調試性,且用戶易于使用
  5. Seamless integration with classic methods for deriving cost:HBO不可用回退至CBO

請添加圖片描述

HBO的思路非常簡單,有幾個不那么難的難點需要解決:

  1. 查詢模版雖然不變,但是其中參數和查詢條件數量存在變化
  2. 統一查詢模版的查詢計劃可能存在差異,因為可能被不同的優化策略該寫過
  3. 搜索類似查詢計劃的開銷很大,畢竟每個查詢都會有數據存儲,且在執行之前都會做統計信息獲取

這些難點可以用三個工程方法解決:

  1. 模版歸一化,具體的操作是Canonicalizing Table scansCanonicalizing plan nodesPruning constants
  2. 將stat-equav的計劃存儲在一起
  3. 哈希

簡單來說整個HBO可以分為以下幾個步驟:

  1. 對plan nodes歸一化,并且找到stat-equav的plan nodes
  2. worker執行完plan后,把統計信息交給Coordinator
  3. Coordinator負責將plan及其stats-equav plan nodes統計信息寫入到redis 里面
  4. 未來查詢的時候,同樣可以根據歸一化的plan node去redis里面拿統計信息

肉眼可見的簡單,但是也伴隨著極大的工程化落地工作量

HBO Scenario

目前有如下場景用到了HBO:

  1. Join reordering:HBO可以準確的拿到之前join算子的準確數據,自然可以選擇最優的連接順序
  2. Join distribution type:拿到join算子的準確數據,即不同表的真實數據輸入,自然可以選擇最優的join方法
  3. Partial aggregations:通過aggregation算子的輸入大小就知道是否需要做二級aggregations了
  4. Skew mitigation:可以知道算子級別準確的null數量,而不是基于假設的估算,這樣就可以判斷是否應用優化規則
  5. Scaled writers:write多文件小,write小寫入性能不足,通過歷史記錄選擇相對較優的write數量

Experiments

請添加圖片描述
簡單查詢CBO已經足夠,復雜查詢HBO可以帶來更優的查詢策略

請添加圖片描述
因為選擇了更優的執行計劃,性能提升很明顯

請添加圖片描述
在presto的場景下,10%的查詢有2.5x的性能提升,中位數為1-1.2x的性能提升,但是也有10%有8%的性能下降

請添加圖片描述
HBO的開銷論文中提到占整個查詢的0.5%左右,大概幾毫秒,大多數是網絡開銷。

結束語

在我們的場景中查詢簡單,且查詢場景多為交互式,對時延要求高,雖然加個幾毫秒問題也不是特別大,但是目前除了Partial aggregations沒有看到其他很好的使用場景,也許可以先研究下presto中150多種優化策略具體有哪些使我們能用的比較重要。

參考:

  1. How Good Are Query Optimizers, Really? vldb2015
  2. Presto’s History-based Query Optimizer 論文筆記
  3. How Good Are Query Optimizers, Really?論文筆記
  4. 數據庫分布式Join類型及意義Broadcast Join、Shuffle Join 和 Colocate Join

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

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

相關文章

【C++】繼承(下)

大家好,我是蘇貝,本篇博客帶大家了解C的繼承(下),如果你覺得我寫的還不錯的話,可以給我一個贊👍嗎,感謝?? 目錄 5.繼承與友元6.繼承與靜態成員7.復雜的菱形繼承及菱形虛擬繼承8.繼…

項目開發實踐——基于SpringBoot+Vue3實現的在線考試系統(九)(完結篇)

文章目錄 一、成績查詢模塊實現1、學生成績查詢功能實現1.1 頁面設計1.2 前端頁面實現1.3 后端功能實現2、成績分段查詢功能實現2.1 頁面設計2.2 前端頁面實現2.3 后端功能實現二、試卷練習模塊實現三、我的分數模塊實現1、 頁面設計2、 前端頁面實現3、 后端功能實現四、交流區…

【流媒體】搭建流媒體服務器

搭建Windows Nginx服務器 搭建 下載nginx工具包解壓至本地,并在cmd窗口中切換至nginx所在的本地目錄修改 conf/nginx.conf 文件,更改其端口號 server中的 listen的端口號從 80改為 8080,因為80經常被其他服務占用,導致無法打開 …

攜程Java開發面試題及參考答案 (200道-下)

insert 一行數據的時候加的是什么鎖?為什么? 在 MySQL 中,當執行 INSERT 操作插入一行數據時,加鎖的情況會因存儲引擎和具體的事務隔離級別而有所不同。一般來說,在 InnoDB 存儲引擎下,INSERT 操作加的是行級排他鎖(Row Exclusive Lock),以下詳細說明原因。 行級排他…

洛谷P11655「FAOI-R5」Lovely 139

P11655「FAOI-R5」Lovely 139 題目背景 Update:數據有 0 0,答案為 1,請選手特判以正常通過。 Height ≤ 139 \text{Height}\leq139 Height≤139。 題目描述 對于一個 01 \tt 01 01 串 S S S(下標從 1 1 1 開始)…

【Linux】24.進程信號(1)

文章目錄 1. 信號入門1.1 進程與信號的相關知識1.2 技術應用角度的信號1.3 注意1.4 信號概念1.5 信號處理常見方式概覽 2. 產生信號2.1 通過終端按鍵產生信號2.2 調用系統函數向進程發信號2.3 由軟件條件產生信號2.4 硬件異常產生信號2.5 信號保存 3. 阻塞信號3.1 信號其他相關…

《手札·開源篇》從開源到商業化:中小企業的低成本數字化轉型路徑 ——以Odoo為數據中臺低成本實現售前售中一體化

某機電設備有限公司數字化轉型案例:以Odoo為數據中臺實現售前售中一體化 一、企業背景某機電設備有限公司在機電設備領域歷經多年發展,業務廣泛,涵蓋工業自動化設備、電力設備等產品的銷售與服務。隨著業務版圖不斷拓展,企業面臨…

筆試-業務邏輯4

應用 小明在玩一個數字加減游戲&#xff0c;輸入4個正整數&#xff1a;s、t、a、b&#xff0c;其中s>1&#xff0c;b<105&#xff0c;a!b。只使用加法或者減法&#xff0c;使得st。 每回合&#xff0c;小明用當前的數字&#xff0c;加上或減去一個數字&#xff1b;目前有…

Windows 中的 WSL:開啟你的 Linux 之旅

今天在安裝windows上安裝Docker Desktop的時候&#xff0c;遇到了WSL。下面咱們就學習下。 歡迎來到濤濤聊AI 一、什么是 WSL&#xff1f; WSL&#xff0c;全稱為 Windows Subsystem for Linux&#xff0c;是微軟為 Windows 系統開發的一個兼容層&#xff0c;它允許用戶在 Win…

編程題-電話號碼的字母組合(中等)

題目&#xff1a; 給定一個僅包含數字 2-9 的字符串&#xff0c;返回所有它能表示的字母組合。答案可以按 任意順序 返回。 給出數字到字母的映射如下&#xff08;與電話按鍵相同&#xff09;。注意 1 不對應任何字母。 解法一&#xff08;哈希表動態添加&#xff09;&#x…

python:如何播放 .spx 聲音文件

.spx 是 Speex音頻編解碼器的文件擴展名&#xff0c;它是一種開源的、免費的音頻編解碼器&#xff0c;主要用于語音壓縮和語音通信領域。spx 文件通常用于語音記錄、VoIP應用、語音信箱等場景。 .mp3 是一種廣泛使用的音頻格式&#xff0c;它采用了有損壓縮算法&#xff0c;可…

數據結構課程設計(三)構建決策樹

3 決策樹 3.1 需求規格說明 【問題描述】 ID3算法是一種貪心算法&#xff0c;用來構造決策樹。ID3算法起源于概念學習系統&#xff08;CLS&#xff09;&#xff0c;以信息熵的下降速度為選取測試屬性的標準&#xff0c;即在每個節點選取還尚未被用來劃分的具有最高信息增益的…

Vue3學習筆記-事件-4

一、事件處理 使用v-on或者后面加事件&#xff1a; <template><button v-on:click"addCount()">{{count}}</button> </template> 二、事件傳參 傳event&#xff1a; 不傳參時&#xff0c;默認自動接收 event 傳自定義參數時&#xff0c…

Node.js下載安裝及環境配置

目錄 一、下載 1. 查看電腦版本&#xff0c;下載對應的安裝包 2. 下載路徑下載 | Node.js 中文網 二、安裝步驟 1. 雙擊安裝包 2. 點擊Next下一步 3. 選擇安裝路徑 4. 這里我選擇默認配置&#xff0c;繼續Next下一步&#xff08;大家按需選擇&#xff09; 5. 最后inst…

k8s二進制集群之ETCD集群證書生成

安裝cfssl工具配置CA證書請求文件創建CA證書創建CA證書策略配置etcd證書請求文件生成etcd證書 繼續上一篇文章《負載均衡器高可用部署》下面介紹一下etcd證書生成配置。其中涉及到的ip地址和證書基本信息請替換成你自己的信息。 安裝cfssl工具 下載cfssl安裝包 https://github…

使用python實現與本地ollama部署的deepseek對話

專欄總目錄 按照ollama官方doc的example操作&#xff0c;沒有成功與本地ollama上的deepseek-r1:1.5b通訊后&#xff0c;發現vscode可以調用本地ollama上的deepseek模型。 為了實現與ollama上的deepseek模型通訊&#xff0c;我使用wireshark對本地回環地址進行偵聽后&#xff0c…

【大模型理論篇】最近大火的DeepSeek-R1初探系列1

1. 背景介紹 這一整個春節&#xff0c;被DeepSeek-R1刷屏。各種鋪天蓋地的新聞以及老板發的相關信息&#xff0c;著實感受到DeepSeek-R1在國外出圈的震撼。 DeepSeek推出了新的推理模型&#xff1a;DeepSeek-R1-Zero 和 DeepSeek-R1。DeepSeek-R1-Zero 是一個在沒有經過監督微調…

C++哈希表深度解析:從原理到實現,全面掌握高效鍵值對存儲

目錄 一、核心組件與原理 1. 哈希函數&#xff08;Hash Function&#xff09; 2. 沖突解決&#xff08;Collision Resolution&#xff09; 3. 負載因子&#xff08;Load Factor&#xff09;與擴容 二、C實現&#xff1a;std::unordered_map 1. 模板參數 2. 關鍵操作與復…

Pandoc, Zotero, JabRef 管理論文引用,生成參考文獻 | 撰寫論文 paper

書接上回&#xff0c;使用 Obsidian, Zotero, JabRef, Pandoc, Markup-Markdown | 撰寫論文 paper 管理論文引用&#xff0c;生成參考文獻 TL; DR導出 bibliography 文件JabRefZotero 參考文獻引用語法reference-docLinks TL; DR 安裝 pandoc v3.6.2. 使用一下命令&#xff0c…

為AI聊天工具添加一個知識系統 之85 詳細設計之26 批流一體式 與數據提取器

Q843、批流一體式 統一數據處理框架 "批流一體式統一數據處理框架" 這一概念通常指的是一種將批處理&#xff08;Batch Processing&#xff09;和流處理&#xff08;Stream Processing&#xff09;結合在一起的數據處理架構。它的目標是提供一個統一的框架&#xff…