本文分享自華為雲社區《GaussDB(DWS)行執行引擎詳解》,作者:yd_227398895。 1.前言 GaussDB(DWS)包含三大引擎,一是SQL執行引擎,用來解析用戶輸入的SQL語句,生成執行計劃,供執行引擎來執行;二是執行引擎,其中包含了行執行引擎和列執行引擎,執行引擎即查詢的執行者, ...
本文分享自華為雲社區《GaussDB(DWS)行執行引擎詳解》,作者:yd_227398895。
1.前言
GaussDB(DWS)包含三大引擎,一是SQL執行引擎,用來解析用戶輸入的SQL語句,生成執行計劃,供執行引擎來執行;二是執行引擎,其中包含了行執行引擎和列執行引擎,執行引擎即查詢的執行者,位於優化器和存儲引擎之間,負責將數據從存儲引擎中讀取出來,並根據計劃將數據處理加工後返回給客戶端,執行引擎的目標是為了更好地利用計算資源,更快地完成計算。三是存儲引擎,決定了資料庫數據的存取方式,直接影響了資料庫的讀寫性能。
其中行執行引擎應用於行存表中,傳統的OLTP(OnLine Transaction Processsing 聯機事務處理)場景與功能、業務強相關,數據需要進行頻繁的增刪改查,這時比較適合使用行存儲式。行存儲的優勢主要有兩個方面:首先是點查性能好,在點查場景下可以直接索引到某行數據的元組位置;其次就是更新效率高,行存儲在實時併發入庫,併發更新方面依然有著比較大的優勢。行執行引擎的關鍵就是:一次處理一行數據,即一tuple,適合數據頻繁更新,增刪改操作多,且查詢結果涉及表的多列的場景。
2.行執行引擎組成
2.1 行執行框架
行執行引擎的執行基本單位是運算元,查詢計劃是以樹的形式存在的,運算元是執行樹上的每個節點。每個運算元需要經歷初始化,執行,清理的生命周期,執行時包括遞歸遍歷計劃樹的各個節點,從計劃樹根節點開始,遞歸到葉節點來獲取一個tuple,經過逐層節點運算元的處理,返回一個結果tuple,直到再無tuple。整體運算元的執行採用Piepline模式,一次一tuple,控制流從上到下,數據流由下到上,圖示實線為控制流,虛線為數據流,使用上層來驅動下層。
2.2 行執行引擎運算元
運算元總共分為四類,掃描運算元,控制運算元,物化運算元,連接運算元等。對於分散式系統而言,還包括著stream運算元等。
2.2.1 掃描運算元
掃描運算元用來掃描表中的數據,每次獲取一條元組作為上層節點的輸入, 存在於查詢計劃樹的葉子節點,它不僅可以掃描表,還可以掃描函數的結果集、鏈表結構、子查詢結果集。一些比較常見的掃描運算元如表所示。
2.2.2 連接運算元
連接運算元對應了關係代數中的連接操作,以表 t1 join t2 為例,主要的集中連接類型如下:inner join、left join、right join、full join、semi join、 anti join,其實現方式包括Nestloop、HashJoin、MergeJoin;
三類連接運算元的實現方式特點:
2.2.3 物化運算元
物化運算元是一類可緩存元組的節點。在執行過程中,很多擴展的物理操作符需要首先獲取所有的元組才能進行操作(例如聚集函數操作、沒有索引輔助的排序等),這是要用物化運算元將元組緩存起來;
2.2.4 控制運算元
控制運算元是一類用於處理特殊情況的節點,用於實現特殊的執行流程。
2.2.5 其他運算元
其他運算元包括Stream運算元,以及RemoteQuery等運算元
Stream運算元主要有三種類型:Gather stream、Broadcast stream、Redistribute stream
Gather運算元: 每個源結點都將其數據發送給目標結點進行匯聚
Broadcast stream: 由一個源節點將其數據發給N個目標節點進行運算
Redistrubute stream: 每個源節點將其數據根據連接條件計算Hash值,根據重新計算的Hash值進行分佈,發給對應的目標節點
3. 執行框架總結
本文主要講解瞭如下幾個方面:
- 大致介紹了GaussDB(DWS)行執行引擎在整個資料庫系統中的位置;
- 介紹了行執行引擎的框架;
- 最後介紹了一些常見和常用的行執行引擎相關的運算元。