最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊

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

2023-08-01 13:43 作者:KaiwuDB  | 我要投稿

一、前言

本文主要介紹內(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ì)劃中。



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

分享到微博請遵守國家法律
保德县| 东阳市| 黎平县| 怀化市| 胶州市| 淮安市| 拜泉县| 平遥县| 靖江市| 务川| 富源县| 汉川市| 龙泉市| 阿坝| 云阳县| 金坛市| 安康市| 栖霞市| 昌平区| 专栏| 玉林市| 南京市| 库尔勒市| 来宾市| 突泉县| 新和县| 马关县| 福州市| 延安市| 闽侯县| 灵璧县| 龙陵县| 永康市| 瑞金市| 云南省| 汽车| 弥渡县| 德格县| 喀什市| 惠水县| 韶关市|