本文分享自華為雲社群《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)行執行引擎在整個資料庫系統中的位置;
- 介紹了行執行引擎的框架;
- 最後介紹了一些常見和常用的行執行引擎相關的運算元。
點選關注,第一時間瞭解華為雲新鮮技術~