聊聊GaussDB AP是如何執行SQL的

来源:https://www.cnblogs.com/huaweiyun/archive/2023/09/07/17684884.html
-Advertisement-
Play Games

本文分享自華為雲社區《GaussDB AP是如何執行SQL的》,作者:yd_270088468。 前言 介紹GaussDB AP各組件是如何協調工作的,會著重介紹SQL引擎。 1、SQL引擎組件和SQL生命周期 Parser: 詞法/語法分析模塊。詞法分析會從SQL字元串中解析出一個個單詞,作為語法 ...


本文分享自華為雲社區《GaussDB AP是如何執行SQL的》,作者:yd_270088468。

前言

介紹GaussDB AP各組件是如何協調工作的,會著重介紹SQL引擎。

1、SQL引擎組件和SQL生命周期

cke_131.png

Parser: 詞法/語法分析模塊。詞法分析會從SQL字元串中解析出一個個單詞,作為語法分析的輸入。語法分析可以想象成是一個"正則表達式",但遠比正則表達式複雜,它定義了所有SQL類型的語法規則以及操作符的優先順序和結合律。語法分析結束後,會生成一個Parse Tree,作為語義分析模塊的輸入。比如一個SQL是SELECT id,data FROM tbl_a WHERE id < 300 ORDER by data;,語法解析生成的Parse Tree如下所示:

cke_132.png

Analyzer: 語義分析模塊。語義分析會訪問資料庫中的對象,檢查表是否存在、列是否合法,並將表、排序列、投影列等轉化為內部對象ID。另外,它還會檢查SQL語義是否正確合法,比如Aggregate函數在where子句中是不合法的。經過語義分析後,Parse Tree會轉化成Query Tree,作為查詢重寫模塊的輸入。Query Tree的結構與Parse Tree有點類似,但在內容上更加豐富,包括Query Tree保存的是資料庫內部的對象信息、多了一些Flag標記等。語義分析生成的Query樹如下所示:

cke_133.png

Rewriter: 查詢重寫模塊。查詢重寫模塊會根據用戶定義的規則對查詢進行重寫,實際是對Query Tree中的成員進行修改或者替換。Rewrite過程如下所示:

cke_134.png

Planner: 優化器模塊。優化器的輸入是Query Tree,輸出Plan Tree,用來指導執行器執行,比如如何join,如何掃描數據,如何排序等。

cke_135.png

Executor: 執行器模塊。根據優化器輸出的Plan Tree,進行初始化、執行,執行的時候會調用存儲引擎的介面,這裡不做展開。

2、SQL執行整體架構

cke_136.png

步驟一:業務通過ELB下發SQL給CN,SQL可以是DDL,DML,DCL。

步驟二:CN判斷SQL類型,如果SQL類型是DDL/DCL,不用生成plan,將SQL發送到其他CN和所有DN,在所有CN/DN上執行。如果SQL類型是DML,對於不需要使用stream運算元的(可以分成3小類),會將SQL直接發給各DN執行,對於需要使用stream運算元的,會生成plan下發給DN執行。

步驟三:DN執行DML過程中,可能會從其他DN獲取數據,DWS提供了三種stream運算元(Redistribute/Broadcast/Gather),降低數據在DN節點間的流動。

步驟四:DN將結果集返回給CN進行彙總。

步驟五:CN將彙總後的結果返回給業務。

3、DDL在CN/DN如何交互

3.1 單DDL的情況

cke_137.png

3.2 併發DDL的情況

為了避免併發DDL造成死鎖,預設開啟enable_parallel_ddl,控制從所有CN下發的DDL都使用同一個CN作為起點開始執行。

cke_138.png

消息序列圖說明

前提:CN 1,CN 2,CN 3上各收到一條對錶test進行DDL操作的請求。CN 1為被選定的第一個執行DDL的節點。

T1:CN 2不是第一個執行DDL操作的節點,所以CN 2將Command 2命令發送給第一個執行的節點CN 1,然後等待CN 1回覆;

T2:CN 3也不是第一個執行DDL操作的節點,所以CN 3將Command 3命令發送給第一個執行的節點CN 1,然後等待CN1回覆;

T3:CN 1是第一個執行DDL操作的節點,故按基線原有邏輯執行,即先在本地執行;

T4:CN 1執行Command 2,對錶test拿鎖。Command 2執行完成後,CN 1告知CN2:Command 2在我上面已經完成。此時,Command 1和Command 3拿不到鎖,處於等待狀態。

T5:CN 2收到CN 1的Command 2執行完畢的回覆之後,給CN 3發送command 2命令,等待CN 3的回覆。

T6:CN 3執行command 2,回覆執行結果給CN 2;

T7:CN 2將command 2發送給DN1,DN2,DN3,要求它們在本地執行並等待他們的回覆;

T8:DN1,DN2,DN3分別在本地執行Command 2,回覆CN 2執行結果;

T9:CN 2本地執行Command 2,成功後提交,至此集群中所有的CN和DN全部放鎖,Command 2執行完畢。

T10:CN 1執行Command 3,對錶test拿鎖。Command 3執行完成後,CN 1告知CN3:Command 3在我上面已經完成。此時,Command 1拿不到鎖,處於等待狀態。

T11:CN 3收到CN 1的Command 3執行完畢的回覆之後,給CN 2發送command 3命令,等待CN 2的回覆。

T12:CN 2執行command 3,回覆執行結果給CN 3;

T13:CN 3將command 3發送給DN1,DN2,DN3,要求它們在本地執行並等待他們的回覆;

T14:DN1,DN2,DN3分別在本地執行Command 3,回覆CN 3執行結果;

T15:CN 3本地執行Command 3,成功後提交,至此集群中所有的CN和DN全部放鎖,Command 3執行完畢。

T16:CN 1將Command 1發送給CN2,CN3,並等待他們的回覆;

T17:CN2,CN3分別在本地執行Command 1,回覆執行結果給CN 1;

T18:CN 1將command 1發送給DN1,DN2,DN3,要求它們在本地執行並等待他們的回覆;

T19:DN1,DN2,DN3分別在本地執行Command 1,回覆CN 1執行結果;

T20:CN 1本地執行Command 1,成功後提交,至此集群中所有的CN和DN全部放鎖,Command 3執行完畢。

從上面實現可以看到,其中心思想是將多CN上併發的DDL操作串列化,即指定一個最先執行的CN,所有的DDL都必須先在這個CN上執行完成後才可以在別的節點上執行。這樣的話,在這個被指定的CN上面,DDL操作就是串列的,拿不到鎖的DDL會等待,但不再會出現拿不到鎖的死鎖情況。

4、DML執行計劃生成

4.1 CBO模型

CBO: Cost-Based Optimization也即"基於代價的優化器",相對於RBO(Rule-Based Optimization),CBO對數據很敏感,執行計劃更靈活,當數據量變化的時候,CBO往往能生成更優的執行計劃。

CBO 的基本優化流程:搜索引擎利用轉換規則,對輸入的邏輯執行計划進行(邏輯/物理)轉換,構造出執行計劃的搜索空間。之後,利用代價模型對搜索空間中的每一個執行計划進行代價估算,選出代價最低的物理執行計劃。而代價估算的過程離不開基數估計:它利用各個表、列的統計信息,估算出各運算元的輸入行數、選擇率等信息,提供給運算元的代價模型,從而估算出查詢計劃的代價。

DWS優化器是基於代價的優化器(CBO),它可以為每一條SQL構造出搜索空間,並根據數據的統計信息、基數估計、運算元代價模型,為搜索空間中的執行機計劃估算出執行所需要的代價(CPU/MEM/IO/NET),最終選出代價最小的執行計劃作為SQL的具體執行方式。

4.2 搜索空間

採用Cascade(動態規劃)/GEQO(遺傳基因)的方式進行計劃搜索。通過Cascade演算法可以實現精確計算,但時間複雜度高,適用於表連接較少的情況。GEQO是非精確計算的方法,適用於表很多的情況。

4.3 統計信息

包括邏輯表的行數,列的非重覆值數(NDV),列Null值信息等。

4.4 基數估計

基數估計會估算各個運算元中間結果的行數或基數等信息,例如Join輸出行數,Agg會產生的Group數量等等。

4.5 運算元代價

對於同類運算元,將所有實現運算元的消耗(代價)均計算出來,選擇代價最小的。

輸入:兩個表的大小、Join列的數據特征、有序性、可用記憶體大小work_mem;

輸出:運算元的代價(消耗時間的維度)

4.6 分散式計劃

序號

分類

作用

執行原理

適用場景

1

CN下發語句

生成完全下推語句的計劃(FQS計劃)

各DN分別根據下推語句生成執行計劃,進行執行,執行結果在CN上進行彙總(FQS,即Fast Query Shipping)

各DN執行時無數據交互,像基表掃描的場景

2

CN下發語句

生成發送語句的分散式計劃(部分下推計劃)

CN下推原語句的部分語句(通常為基表掃描)到DN,各DN分別根據下推語句生成執行計劃,執行後將結果發送給CN,CN執行剩餘計劃

不能滿足1,3,4的極端場景,性能非常差。目前不支持下推的特征主要有:record數據類型、volatile函數等

3

CN下發語句

生成CN輕量化的計劃

由DN生成執行計劃返回結果

只有單DN執行語句,且DN結果即為最終返回結果

4

CN生成計劃

生成下發Plan的分散式計劃(Stream計劃)

CN根據原語句生成計劃,下發給DN進行執行,各DN執行過程中存在數據交互(Stream操作符)

各DN執行時有數據交互,AP場景下的複雜語句

前3個計劃都是CN下發語句給DN,第4個計劃是CN生成計劃,將計划下發給DN,第4個計劃也被稱為stream計劃,是最為常用的計劃。

為什麼會有下發語句的計劃?

CN生成執行計劃,需要耗費較多CPU資源,且計劃較原始語句大許多,下發語句對於CN以及網路傳輸的開銷小很多。

號外!

cke_41127.jpeg

華為將於2023年9月20-22日,在上海世博展覽館和上海世博中心舉辦第八屆華為全聯接大會(HUAWEICONNECT 2023)。本次大會以“加速行業智能化”為主題,邀請思想領袖、商業精英、技術專家、合作伙伴、開發者等業界同仁,從商業、產業、生態等方面探討如何加速行業智能化。

我們誠邀您蒞臨現場,分享智能化的機遇和挑戰,共商智能化的關鍵舉措,體驗智能化技術的創新和應用。您可以:

  • 在100+場主題演講、峰會、論壇中,碰撞加速行業智能化的觀點
  • 參觀17000平米展區,近距離感受智能化技術在行業中的創新和應用
  • 與技術專家面對面交流,瞭解最新的解決方案、開發工具並動手實踐
  • 與客戶和伙伴共尋商機

感謝您一如既往的支持和信賴,我們熱忱期待與您在上海見面。

大會官網:https://www.huawei.com/cn/events/huaweiconnect

歡迎關註“華為雲開發者聯盟”公眾號,獲取大會議程、精彩活動和前沿乾貨。

 

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

 


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

-Advertisement-
Play Games
更多相關文章
  • 在 Spring 中,`@Autowired` 註解的使用在不同的上下文中會產生不同的效果,這取決於所在的組件或類是否由**Spring**管理。 1. **`@Aspect` 註解的使用**:`@Aspect` 註解通常用於聲明切麵,而切麵是 Spring 管理的組件。因此,`@Autowired ...
  • # Unity UGUI的ScrollRect(滾動視圖)組件的介紹及使用 ## 1. 什麼是ScrollRect組件? ScrollRect(滾動視圖)是Unity UGUI中的一個常用組件,用於在UI界面中創建可滾動的區域。通過ScrollRect組件,可以實現在有限的空間內顯示大量的內容,並且 ...
  • [toc] | 說明 | 內容 | | | | | 漏洞編號 | CVE-2017-10271 | | 漏洞名稱 | Weblogic 其中使用了XMLDecoder來解析用戶傳入的XML數據在解析的過程中出現反序列化漏洞,導致可執行任意命令 | | 修複方案 | 打補丁上設備升級組件 | ### ...
  • 博主之前發佈了紅帽體系的Centos7關於openssl和openssh的升級操作;本文就Ubuntu系統再次分享和交流ssh的升級。如有不正確,歡迎在評論區指出。 之前博主的相關文章: openssh-淺談openssl和openssh的升級 - 李宗盛 - 博客園 (cnblogs.com) o ...
  • 對於有科班背景的讀者,可以跳過本系列文章。這些文章的主要目的是通過簡單易懂的彙總,幫助非科班出身的讀者理解底層知識,進一步瞭解為什麼在面試中會涉及這些底層問題。否則,某些概念將始終無法理解。這些電腦基礎文章將為你打通知識的任督二脈,祝你在編程領域中取得成功! ...
  • 1. 進程和線程的區別 進程(Process)和線程(Thread)是操作系統中的重要概念,它們表示執行中的程式的不同執行單元。下麵是它們的區別: 定義:進程是一個獨立的執行環境,具有獨立的記憶體空間,包含程式代碼、數據和執行狀態。線程是進程內的一個執行單元,共用相同的記憶體空間和系統資源。 資源占用: ...
  • ![](https://img2023.cnblogs.com/blog/3076680/202309/3076680-20230907165115014-2093238023.png) # 1. 從軟體本身和它運行的典型工作負載來看,MySQL通常也更適合運行在廉價硬體上 # 2. 基本資源 ## ...
  • 編輯my.ini或者my.cnf文件 #### 清空binlog信息 ```sql #查看現存的binlog文件列表 show master logs; #重置清空binlog文件 reset master; #重置清空後 重新查看現存的binlog文件列表 是否都被清空了 show master ...
一周排行
    -Advertisement-
    Play Games
  • 前言 微服務架構已經成為搭建高效、可擴展系統的關鍵技術之一,然而,現有許多微服務框架往往過於複雜,使得我們普通開發者難以快速上手並體驗到微服務帶了的便利。為瞭解決這一問題,於是作者精心打造了一款最接地氣的 .NET 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...