本文分享自華為云社區(qū)《GaussDB(DWS)行執(zhí)行引擎詳解》,作者:yd_227398895。 1.前言 GaussDB(DWS)包含三大引擎,一是SQL執(zhí)行引擎,用來解析用戶輸入的SQL語句,生成執(zhí)行計(jì)劃,供執(zhí)行引擎來執(zhí)行;二是執(zhí)行引擎,其中包含了行執(zhí)行引擎和列執(zhí)行引擎,執(zhí)行引擎即查詢的執(zhí)行者,
本文分享自華為云社區(qū)《GaussDB(DWS)行執(zhí)行引擎詳解》,作者:yd_227398895。
華為云的GaussDB(DWS)是一個(gè)強(qiáng)大的數(shù)據(jù)庫(kù)系統(tǒng),它包含了三大引擎:SQL執(zhí)行引擎、執(zhí)行引擎和存儲(chǔ)引擎。其中,執(zhí)行引擎又包含了行執(zhí)行引擎和列執(zhí)行引擎。行執(zhí)行引擎在行存表中發(fā)揮作用,適用于傳統(tǒng)的OLTP(OnLine Transaction Processsing 聯(lián)機(jī)事務(wù)處理)場(chǎng)景,特別適合需要頻繁進(jìn)行增刪改查操作的業(yè)務(wù)。本文將深入探討行執(zhí)行引擎的組成和工作原理。
GaussDB(DWS)包含三大引擎,一是SQL執(zhí)行引擎,用來解析用戶輸入的SQL語句,生成執(zhí)行計(jì)劃,供執(zhí)行引擎來執(zhí)行;二是執(zhí)行引擎,其中包含了行執(zhí)行引擎和列執(zhí)行引擎,執(zhí)行引擎即查詢的執(zhí)行者,位于優(yōu)化器和存儲(chǔ)引擎之間,負(fù)責(zé)將數(shù)據(jù)從存儲(chǔ)引擎中讀取出來,并根據(jù)計(jì)劃將數(shù)據(jù)處理加工后返回給客戶端,執(zhí)行引擎的目標(biāo)是為了更好地利用計(jì)算資源,更快地完成計(jì)算。三是存儲(chǔ)引擎,決定了數(shù)據(jù)庫(kù)數(shù)據(jù)的存取方式,直接影響了數(shù)據(jù)庫(kù)的讀寫性能。
其中行執(zhí)行引擎應(yīng)用于行存表中,傳統(tǒng)的OLTP(OnLine Transaction Processsing 聯(lián)機(jī)事務(wù)處理)場(chǎng)景與功能、業(yè)務(wù)強(qiáng)相關(guān),數(shù)據(jù)需要進(jìn)行頻繁的增刪改查,這時(shí)比較適合使用行存儲(chǔ)式。行存儲(chǔ)的優(yōu)勢(shì)主要有兩個(gè)方面:首先是點(diǎn)查性能好,在點(diǎn)查場(chǎng)景下可以直接索引到某行數(shù)據(jù)的元組位置;其次就是更新效率高,行存儲(chǔ)在實(shí)時(shí)并發(fā)入庫(kù),并發(fā)更新方面依然有著比較大的優(yōu)勢(shì)。行執(zhí)行引擎的關(guān)鍵就是:一次處理一行數(shù)據(jù),即一tuple,適合數(shù)據(jù)頻繁更新,增刪改操作多,且查詢結(jié)果涉及表的多列的場(chǎng)景。
行執(zhí)行引擎的執(zhí)行基本單位是算子,查詢計(jì)劃是以樹的形式存在的,算子是執(zhí)行樹上的每個(gè)節(jié)點(diǎn)。每個(gè)算子需要經(jīng)歷初始化,執(zhí)行,清理的生命周期,執(zhí)行時(shí)包括遞歸遍歷計(jì)劃樹的各個(gè)節(jié)點(diǎn),從計(jì)劃樹根節(jié)點(diǎn)開始,遞歸到葉節(jié)點(diǎn)來獲取一個(gè)tuple,經(jīng)過逐層節(jié)點(diǎn)算子的處理,返回一個(gè)結(jié)果tuple,直到再無tuple。整體算子的執(zhí)行采用Piepline模式,一次一tuple,控制流從上到下,數(shù)據(jù)流由下到上,圖示實(shí)線為控制流,虛線為數(shù)據(jù)流,使用上層來驅(qū)動(dòng)下層。
算子總共分為四類,掃描算子,控制算子,物化算子,連接算子等。對(duì)于分布式系統(tǒng)而言,還包括著stream算子等。
掃描算子用來掃描表中的數(shù)據(jù),每次獲取一條元組作為上層節(jié)點(diǎn)的輸入, 存在于查詢計(jì)劃樹的葉子節(jié)點(diǎn),它不僅可以掃描表,還可以掃描函數(shù)的結(jié)果集、鏈表結(jié)構(gòu)、子查詢結(jié)果集。一些比較常見的掃描算子如表所示。
連接算子對(duì)應(yīng)了關(guān)系代數(shù)中的連接操作,以表 t1 join t2 為例,主要的集中連接類型如下:inner join、left join、right join、full join、semi join、 anti join,其實(shí)現(xiàn)方式包括Nestloop、HashJoin、MergeJoin;
三類連接算子的實(shí)現(xiàn)方式特點(diǎn):
物化算子是一類可緩存元組的節(jié)點(diǎn)。在執(zhí)行過程中,很多擴(kuò)展的物理操作符需要首先獲取所有的元組才能進(jìn)行操作(例如聚集函數(shù)操作、沒有索引輔助的排序等),這是要用物化算子將元組緩存起來;
控制算子是一類用于處理特殊情況的節(jié)點(diǎn),用于實(shí)現(xiàn)特殊的執(zhí)行流程。
其他算子包括Stream算子,以及RemoteQuery等算子
Stream算子主要有三種類型:Gather stream、Broadcast stream、Redistribute stream
小編推薦閱讀
如何使用 Pytorch 中的 DataSet 和 DataLoader
閱讀golang slice相關(guān)常見的性能優(yōu)化手段
閱讀連接Elasticsearch服務(wù)器的Python代碼示例
閱讀國(guó)產(chǎn)操作系統(tǒng)上實(shí)現(xiàn)RTMP推流攝像頭視頻和麥克風(fēng)聲音到流媒體服務(wù)器
閱讀使用Python讀取和導(dǎo)出NetCDF格式的多時(shí)相柵格文件
閱讀多租戶系統(tǒng)數(shù)據(jù)權(quán)限設(shè)計(jì)與RuoYi系統(tǒng)的借鑒
閱讀count(*)、count(1)哪個(gè)更快?面試必問:通宵整理的十道經(jīng)典MySQL必問面試題
閱讀從需求分析、產(chǎn)品設(shè)計(jì)到部署交付各階段說明
閱讀如何利用七牛云進(jìn)行數(shù)據(jù)備份和刪除
閱讀強(qiáng)化學(xué)習(xí)筆記之【ACE:Off-PolicyActor-CriticwithCausality-AwareEntropyRegularization】
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2024 haote.com 好特網(wǎng)