GaussDB SQL查詢語句執行過程解析

来源:https://www.cnblogs.com/huaweiyun/p/18154664
-Advertisement-
Play Games

今天我們就從GaussDB SQL引擎入手,瞭解一下GaussDB SQL 查詢語句的執行過程,包括GaussDB SQL引擎原理和關鍵技術點。 ...


本文分享自華為雲社區《【GaussTech第2期】GaussDB SQL查詢語句執行過程解析》,作者: GaussDB 資料庫。

頂部title.jpg

SQL於關係型資料庫而言,重要性不言而喻。就像一個樂團的指揮,指導著作品的正確演繹和節奏的和諧統一。華為雲GaussDB作為新一代關係型分散式資料庫,具備卓越的技術性能和行業競爭力。很多人對GaussDB的關鍵技術很好奇,紛紛在論壇帖上留言:

GaussDB SQL語句到底是如何執行的? GaussDB SQL引擎原理是什麼?   GaussDB SQL引擎有哪些關鍵技術點? …….

今天我們就從GaussDB SQL引擎入手,瞭解一下GaussDB SQL查詢語句的執行過程,包括GaussDB SQL引擎原理和關鍵技術點。

如果您在瞭解的過程中有任何疑問或感興趣的關鍵技術點,可參與【雲咖問答】揭開GaussDB SQL引擎的神秘面紗,互動交流贏好禮活動,進行留言互動,專家會一對一進行答疑哦,更有機會獲得提問好禮激勵。

↓↓↓↓ 以下是正文

首先,簡單介紹一下GaussDB的系統結構,再解析GaussDB SQL查詢語句的執行過程。

GaussDB系統架構

GaussDB在華為雲上有集中式(圖1)和分散式(圖2)兩種部署形態,如下圖所示:

1.png

圖(1) 集中式

2.png

圖(2) 分散式

在GaussDB SQL語句執行過程中,會涉及以下幾個關鍵角色:

GTM

全局事務管理器(Global Transaction Manager),負責生成和維護全局事務ID、事務快照、時間戳、sequence信息等全局唯一的信息。

CN

協調節點(Coordinator Node)。負責接收來自應用的訪問請求,並向客戶端返回執行結果;負責分解任務,並調度任務分片在各DN上並行執行。每個CN與每個DN相連接,每個CN各持有一份元數據,元數據內容相同。

DN

數據節點(Data Node)。負責存儲業務數據(支持行存、列存、混合存儲)、執行數據查詢任務以及向CN返回執行結果。

其中,DN主要承擔GaussDB SQL語句的執行,其邏輯架構如下圖所示:

3.png

圖(3) GaussDB邏輯架構

GaussDB包括兩個主要引擎:SQL引擎 (SQL Engine) 和存儲引擎 (Storage Engine) 。SQL引擎有時也被稱為查詢處理器,它的主要功能是SQL 解析、查詢優化和查詢執行。SQL解析對輸入的 SQL 語句進行詞法解析、語法解析、語義解析,從而生成查詢樹。查詢樹經過規則優化(RBO)和代價優化(CBO)之後,產生執行計劃。執行器基於該執行計劃對相關數據進行提取、運算、更新、刪除等操作,以達到用戶查詢想要實現的結果。

存儲引擎負責管理所有數據的I/O,它包含數據讀寫處理(處理行、索引、頁、分配和行版本的I/O請求)、數據緩衝管理(Buffer Pool)和事務管理器。其中,事務管理又涉及到保持ACID屬性的鎖機制(Lock)和事務日誌管理(XLOG)。

在SQL引擎和存儲引擎之間是AM(Access Method) 層。AM對存儲層做了封裝,以支持多種存儲引擎(Astore,Ustore,etc.)。SQL層不直接調用存儲層,而是通過AM層,AM層會根據不同的存儲引擎調用不同的執行體。

從GaussDB邏輯架構圖中可以看出,GaussDB架構設計遵循現代軟體系統抽象化和分層解耦的設計原則,包括:統一事務機制、統一日誌系統、統一併發控制系統、統一元信息系統、統一緩存管理系統。因此,GaussDB技術架構具備以下主要特點:

  • 支持SQL優化、執行、存儲分層解耦;
  • 支持可插拔存儲引擎。

SQL查詢語句的執行過程

一條SQL查詢(SELECT)語句的執行過程,如下所示:

4.png

圖(4) 查詢語句的執行過程

從上圖可以看出,一條SQL語句需要經過SQL解析生成查詢樹、查詢優化生成執行計劃,然後將執行計劃轉交給查詢執行器做物理運算元的執行操作。

SQL是介於關係演算和關係代數之間的一種描述性語言,它吸取了關係代數中一部分邏輯運算元的描述,而放棄了關係代數中 “過程化” 的部分。SQL解析主要的作用就是將一個SQL語句編譯成為一個由關係運算元組成的查詢樹,通常包含詞法解析、語法解析、語義解析幾個子模塊。

規則優化(RBO)則是在查詢樹的基礎上進行等價的關係代數變換,把一條SQL語句轉換為更高效的等價SQL,併在資料庫優化器中扮演關鍵角色。尤其在複雜查詢中,它能夠在性能上帶來數量級的提升。

查詢執行是根據執行計劃來執行SQL查詢語句。底層存儲方式的選擇合理性,將影響查詢執行效率。

解析器

GaussDB SQL解析通常包含詞法解析、語法解析、語義解析:

1.詞法解析:從查詢語句中識別出系統支持的關鍵字、標識符、運算符、終結符等,確定每個詞固有的詞性。

SQL標准定義了SQL的關鍵字以及語法規則信息,GaussDB在做詞法分析過程中會將一個SQL語句根據關鍵字信息以及間隔信息劃分為獨立的原子單位,每個單位以一個詞的方式展現。

2. 語法解析:根據定義的SQL語法規則,使用詞法分析中產生的詞去匹配語法規則,並生成對應的抽象語法樹(Abstract Syntax Tree,AST)。

3. 語義解析:對語法樹進行有效性檢查,檢查語法樹中對應的表、列、函數、表達式是否有對應的元數據,將抽象語法樹轉換為查詢樹。

語義解析的過程也是有效性語義綁定的過程,通過語義分析的檢查,抽象語法樹就轉換成一個查詢樹。查詢樹可以通過關係代數表達式的形式來表現。

優化器

優化器是提升查詢效率非常重要的一個手段,它包括規則優化和查詢優化兩部分。

規則優化(RBO)

規則優化是在查詢樹的基礎上進行等價的關係代數變換,由於它是建立在關係代數基礎之上的優化形式,也可稱為代數優化。雖然兩個關係代數式獲得的結果完全相同,但是它們的執行代價卻可能有很大的差異,這就構成了規則優化的基礎。

規則優化遵循兩個基本原則:

(1)等價性:原語句和重寫後的語句輸出結果相同。

(2)高效性:重寫後的語句比原語句執行時間短,且資源使用更高效。

GaussDB實現了一些關鍵的規則優化技術,例如:

謂詞下推:更早地觸發條件過濾,減少處理行數

冗餘運算消除:消除冗餘的表、列,減少計算量

子查詢提升:提升後可以匹配更多連接順序

Outer-To-Inner轉換:Inner Join可以匹配更多連接順序

子鏈接提升:減少subplan和Broadcast運算

消除不等值連接:減少NestLoop和Broadcast運算

在服務大量的客戶過程中,GaussDB對業務 SQL使用模式進行抽象,並實現了一些高級重寫規則。在今後的欄目中,我們會對GaussDB的規則優化技術做詳細介紹。

查詢優化

查詢優化是根據“規則優化”的輸出,結合資料庫內部統計信息來規劃SQL語句具體的執行方式,也就是執行計劃。基於優化方法的不同,查詢優化技術可以分為:

(1)CBO(Cost Based Optimization,基於代價的查詢優化):對SQL語句對應的待選執行路徑進行代價估算,從待選路徑中選擇代價最低的執行路徑作為最終的執行計劃。

(2)ABO(AI Based Optimization,基於機器學習的查詢優化):通過對歷史經驗的不斷學習,ABO將目標場景的模式進行抽象化,形成動態的模型,自適應地針對用戶的實際場景進行優化,從而獲得最優的執行計劃。

GaussDB採用基於CBO的優化技術,並結合ABO在建模效率、估算準確率和自適應性等方向進行積極探索,步驟如下:

5.png

圖(5) 查詢優化步驟

統計信息模型:統計信息是計算計劃路徑代價的基石,統計信息的準確度對代價估算模型中行數估算和代價估算起著至關重要的作用,直接影響查詢計劃的優劣。GaussDB基表數據的特征包括distinct值、MCV (Most Common Values) 值、直方圖等。

行數估算 (Row Estimation):當一個約束條件確定了選擇率之後,就可以確定每個計劃路徑所需要處理的行數,並根據行數推算出所需要處理的頁面數,為代價估算做準備。

代價估算 (Cost Estimation):根據數據量估算不同運算元執行代價,各運算元代價之和即為計劃的總代價。

當計劃路徑處理頁面的時候,會產生I/O代價,而當計劃路徑處理元組的時候(例如,針對元組做表達式計算 ),會產生CPU代價。由於GaussDB是分散式資料庫,在CN和DN之間傳輸數據又會產生通信代價,因此一個計劃的總代價可以表示為:

總代價 = IO代價 + CPU代價 + 通信代價

  • 路徑搜索:通過求解路徑最優演算法(動態規劃、遺傳演算法)處理連接路徑搜索過程,以最小搜索空間找到最優連接路徑。

GaussDB採用的是自底向上和隨機搜索模式相結合的方式。搜索過程也都是一個從查詢樹向執行計劃轉變的過程,例如針對每個表可以有不同的掃描運算元,而邏輯連接運算元也可以轉換為多種不同的物理連接運算元。

  • 計劃生成:將查詢執行路徑轉換成執行計劃(PlanTree),提供給執行器執行。

查詢優化可能需要花費較長時間,特別是在處理複雜查詢時。計劃緩存是GaussDB的一個重要功能,它可以緩存查詢語句的執行計劃,以便在下次執行相同查詢時可以直接使用緩存中的執行計劃,從而避免重覆計算和優化查詢性能。

【關鍵技術點】CBO + ABO:通過引入AI演算法,改進CBO模型,賦予查詢優化器能夠根據數據而動態調整評估結果的能力。   【關鍵技術點】計劃緩存:GaussDB 的計劃緩存具備計劃自適應選擇和自動更新的能力。它可以自動為不同參數配置選擇最佳的緩存計劃,以保證查詢性能的穩定和優化。

分散式查詢優化

作為原生分散式資料庫,分散式查詢優化技術尤為重要。

GaussDB分散式架構充分運用每個節點的計算資源,且隨著節點規模的擴大其整體性能也呈線性增長。為了實現分散式架構下性能和資源的利用最大化,GaussDB支持四種分散式計劃,分別為CN 輕量化計劃、FQS(Fast Query Shipping)計劃、Stream計劃和Remote-Query計劃,如下圖所示:

6.png

圖(6) 四種分散式計劃

  • CN 輕量化: 語句直接下發到單個 DN 上執行(LIGHT_PROXY)

    • 執行原理:CN通過socket直接下發語句QPBE報文到對應DN。

  • 適用場景:語句可以直接在一個DN執行(單shard語句)。

  • FQS(Fast Query Shipping)語句下發: 下發SQL語句的計劃

    (REMOTE_FQS_QUERY)

    • 執行原理:CN不通過優化器,直接生成RemoteQuery計劃,走執行器邏輯下發到DN。各DN根據下推語句生成執行計劃併進行執行,執行結果在CN上進行彙總。

    • 適用場景:語句可以完全下推到多個DN上執行,且DN之間不需要數據交互。

  • STREAM 計划下發:下發SQL計劃的分散式計劃(STREAM)

    • 執行原理:CN根據原語句通過優化器生成帶stream運算元的執行計劃,下發給DN進行執行,DN執行過程中存在數據交互(stream節點)。stream運算元在DN之間建立連接進行數據交互,CN彙總執行結果。DN承擔了大部分計算。

    • 適用場景:執行時CN和DN之間、DN和DN之間有數據交互的複雜語句。

  • Remote-Query 計劃:下發部分SQL語句的分散式計劃 (REMOTE_QUERY)

    • 執行原理:CN通過優化器把原語句中的部分語句生成RemoteQuery計劃,把每個RemoteQuery下發到DN,DN執行後把中間結果數據發送給CN,CN收集後進行剩餘執行計劃的執行計算,因此,CN承擔了大部分計算。

  • 適用場景:不滿足前三種生成條件的極少數場景,性能非常差。

在分散式架構下,同一個表的數據會分佈到不同的數據節點上,創建表的時候可以選擇將數據在每個表上做哈希(Hash)分佈或者隨機分佈。為了正確執行兩表連接操作,有可能需要將兩個表的數據重新分佈,因此,GaussDB的分散式執行計劃中增加了三個使數據形成特定分佈方式的Stream運算元。

7.png

圖(7) Stream運算元

分散式路徑生成時,會考慮兩表及連接條件上的數據是否處於同一個數據節點,如果不是,則會添加相應的數據分發運算元。根據降低數據在DN節點間流動的原則來選擇重分佈的Stream運算元。

正是基於Stream運算元的合理運用,GaussDB在分散式架構下處理大規模數據才成為可能。針對Stream運算元的優化也是GaussDB 查詢優化的重要部分。

8.png

圖(8) GaussDB分散式查詢優化技術

【關鍵技術點】分散式查詢優化:四種分散式執行計劃、三個Stream運算元。

執行器

執行器接收到的指令就是由優化器針對SQL查詢語句而產生的執行計劃,而執行計劃是由一些執行運算元(Operator)、表達式等組成,主要是對關係集合進行運算,最終輸出用戶想要的結果集。下麵是幾類常見的執行運算元:

1. 掃描運算元(Scan Plan Node)

掃描節點負責從底層數據來源抽取數據,數據來源可能是來自文件系統,也可能來自網路。一般而言掃描節點都位於執行樹的葉子節 點,作為執行的數據輸入來源,典型代表SeqScan、IndexScan、 SubQueryScan 。

關鍵特征:輸入數據、葉子節點、表達式過濾

2. 控制運算元(Control Plan Node)

控制運算元一般不映射代數運算符,是為了執行器完成一些特殊的流程引入的運算元,例如Limit、RecursiveUnion、Union。

關鍵特征:用於控制數據流程

3. 物化運算元(Materialize Plan Node)

物化運算元一般指演算法要求,在做運算元邏輯處理的時候,要求把下層 的數據進行緩存處理,因為對於下層運算元返回的數據量不可提前預 知,因此需要在演算法上考慮數據無法全部放置到記憶體的情況,例如 Agg、Sort 。

關鍵特征:需要掃描所有數據之後才返回

4. 連接運算元(Join Plan Node) 這類運算元是為了應對資料庫中最常見的關聯操作,根據處理演算法和 數據輸入源的不同分成MergeJoin, NestLoop Join, HashJoin。

關鍵特征:關聯查詢

5. 其它運算元

執行器的架構和技術也決定了資料庫查詢執行的整體運行效率。GaussDB執行引擎充分結合現代硬體技術的特征,採用了諸如向量化引擎、LLVM等多種現代軟體技術,進行高效執行。

9.png

圖(9) GaussDB全並行執行架構

GaussDB 在執行分散式計划過程中,也採用了多種技術來提升查詢執行的性能。例如,在執行複雜查詢時,會將重執行運算元下推到 DN 節點執行,如 AGG 運算元等。在下推運算元執行時,會考慮數據本地性,儘可能在本地計算,減少數據在網路中的傳輸開銷。

【關鍵技術點】全並行執行架構:MPP,SMP,LLVM,SIMD 全並行執行,發揮系統極致性能,充分利用CPU資源來提高查詢性能,後期我們將對全並行執行中的技術一一展開介紹。

如果您有任何疑問,或者感興趣的關鍵技術點,可在【雲咖問答】揭開GaussDB SQL引擎的神秘面紗,互動交流,贏好禮活動帖里進行留言,專家會一對一進行答疑哦,還有機會獲得提問激勵。

點擊關註,第一時間瞭解華為雲新鮮技術~

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 雙向鏈表 雙向鏈表的原理與應用 如果想要提高單向鏈表或者單向迴圈鏈表的訪問速度,則可以在鏈表中的結點中再添加一個指針域,讓新添加的指針域指向當前結點的直接前驅的地址,也就意味著一個結點中有兩個指針域(prev + next),也被稱為雙向鏈表(Double Linked List)。 單向迴圈鏈表實 ...
  • 單向迴圈鏈表(其一) 單向迴圈鏈表的原理與應用: 單向迴圈的鏈表的使用規則和普通的單向鏈表沒有較大的區別,需要註意:*單向迴圈鏈表的尾結點的指針域中必須指向鏈表的首結點的地址*,由於帶頭結點的單向迴圈鏈表更加容易進行管理,如下圖所示: 上圖所示的就是一個典型的單向迴圈鏈表的結構,可以發現單向迴圈鏈表 ...
  • Lab2: system calls 預備知識 執行一次系統調用的流程: USER MODE step1:系統調用聲明 user/user.h:系統調用函數(如 int fork(void)) step2:ecall 進入內核態 user/usys.S(該文件由 user/usys.pl 生成,後續 ...
  • 18.鏈表只能一個接著一個遍歷,不允許通過隨機訪問 7.鏈表的地址是連續的,通過內部的指針來進行訪問 //假設該鏈表只給出了頭指針 head。在不改變鏈表的前提下,請設計一個儘可能高效的演算法, //查找鏈表中倒數第k(k為正整數)個位置上的結點。若查找成功,演算法輸出該結點的 data值,並返回 1; ...
  • 轉載自天地風雷水火山澤 目的 因為我們的數倉數據源是Kafka,離線數倉需要用Flume採集Kafka中的數據到HDFS中。 在實際項目中,我們不可能一直在Xshell中啟動Flume任務,一是因為項目的Flume任務很多,二是一旦Xshell頁面關閉Flume任務就會停止,這樣非常不方便,因此必須 ...
  • 本文分享自華為雲社區《對接HiveMetaStore,擁抱開源大數據》,作者:睡覺是大事。 1. 前言 適用版本:9.1.0及以上 在大數據融合分析時代,面對海量的數據以及各種複雜的查詢,性能是我們使用一款數據處理引擎最重要的考量。而GaussDB(DWS)服務有著強大的計算引擎,其計算性能優於MR ...
  • 近日,以“Data+AI,構建新質生產力”為主題的袋鼠雲春季發佈會圓滿落幕,大會帶來了一系列“+AI”的數字化產品與最新行業沉澱,旨在將數據與AI緊密結合,打破傳統的生產力邊界,賦能企業實現更高質量、更高效率的數字化發展。會上,袋鼠雲業務總經理申杭帶來了以“指標+AI:邁向智能化,讓指標應用更高效” ...
  • 本文介紹基於Microsoft SQL Server軟體,實現資料庫創建、分離、附加、刪除與備份的方法。 目錄1 互動式創建資料庫2 Transact-SQL指定參數創建資料庫3 互動式分離資料庫testbase14 使用系統存儲過程分離資料庫testbase25 資料庫文件備份:分離資料庫再複製其 ...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...