構(gòu)建高效物理計(jì)劃:從邏輯查詢到算子實(shí)現(xiàn)

一、前言
本文主要介紹內(nèi)容一條查詢語句如何實(shí)現(xiàn)由邏輯計(jì)劃生成物理計(jì)劃。查詢語句要執(zhí)行的操作、涉及的表信息等存放于邏輯計(jì)劃的?PlanNode?中,物理計(jì)劃的構(gòu)建就是通過解析邏輯計(jì)劃的?PlanNode,將對應(yīng)的?PlanNode?轉(zhuǎn)換為對應(yīng)算子(Processor),算子之間再通過 Stream?連接。

為了方便大家理解本文的內(nèi)容,先簡單介紹下面三個(gè)概念:
Physical Plan:物理計(jì)劃,將邏輯查詢計(jì)劃的每一個(gè)操作符選擇實(shí)現(xiàn)算法并選擇這些操作符的執(zhí)行順序得到的計(jì)劃。
Processor:物理計(jì)劃得到的結(jié)果,存放了語句所需要執(zhí)行的算子的相關(guān)信息,需要執(zhí)行什么算子,分布式中算子需要發(fā)送到哪個(gè)節(jié)點(diǎn)中執(zhí)行等。
Stream:存放在?Processor?的信息,標(biāo)注了?Processor?中的算子的執(zhí)行順序以及執(zhí)行節(jié)點(diǎn)的信息。
二、物理計(jì)劃的構(gòu)建
我們將通過以下?SQL 語句來介紹物理計(jì)劃的生成:
該查詢語句的?PlanNode?如下圖所示:

以上述?PlanNode?為例,其最下層為兩個(gè)?scanNode,分別是對?heights?和?students?的一個(gè)全表掃描,其結(jié)果會(huì)返回給上層的?joinNode,joinNode?會(huì)將兩張表作?join?生成一張?zhí)摂M表,里面有兩張表中的所有列。
其上層的?renderNode?會(huì)對這張?zhí)摂M表進(jìn)行查詢,篩選出?height?列和?class?列,groupNode?會(huì)對?class?列進(jìn)行?group?處理,并對?class?作?max?聚合。
然后,?sortNode?對?groupNode?處理過的?max?聚合結(jié)果進(jìn)行排序,limitNode?對結(jié)果作相應(yīng)的操作。最后,最上層的?renderNode?對結(jié)果進(jìn)行查詢,篩選出?max(height)?列和?class?列。以上即為該?PlanNode?的詳細(xì)信息。
接著會(huì)通過?createPlanForNode?函數(shù)對?PlanNode?進(jìn)行解析生成物理計(jì)劃。該函數(shù)是一個(gè)遞歸函數(shù),會(huì)通過?PlanNode?的類型來構(gòu)建相應(yīng)的物理計(jì)劃。
以上述查詢語句為例,該?PlanNode?會(huì)層層遞歸先執(zhí)行?scanNode?的構(gòu)建函數(shù)?createTableReaders;接著,通過?initTableReaderSpec?新建?tablereader?的?spec;隨后,通過邏輯計(jì)劃傳下來的?plannode?得到算子的?filter?和?limit;然后,通過?MakeExpression()?構(gòu)造物理計(jì)劃的?filter?并將?filter?和?limit?傳入?post?中。
最后,通過?planCtx?的?isLocal?判斷是否是分布式讀取計(jì)劃。
若是,則構(gòu)建?SpanPartition?數(shù)組,將到各個(gè)節(jié)點(diǎn)讀取?table?的值;
若不是,則單讀取本地?cái)?shù)據(jù)即可。
具體流程如下圖所示:

在構(gòu)建完?left scanNode?和?right scanNode?的計(jì)劃后得到?rightPlan?和?leftPlan,?leftPlan?和?rightPlan?執(zhí)行?MergePlans()?合并左右計(jì)劃,將左右計(jì)劃的?processor?和?stream?等信息合并。
之后判斷是否為分布式執(zhí)行的步驟與上面的判斷方法類似。最后再判斷?leftMergeOrd.Columns?是否等于?nil。
若是,則構(gòu)建?hashjoinspec;
若不是,則構(gòu)建?mergejoinspec。
執(zhí)行?AddjoinStage()?將?joinProcessor?添加到指定的節(jié)點(diǎn)上去并將左右?output?連接到這些 Processor?中,joinNode?也就處理完畢了,基本流程如下圖。依次處理?renderNode,??groupNode,?sortNode?等,將相應(yīng)算子信息添加到物理計(jì)劃中。
