PostgreSQL Executor(2): 不可優(yōu)化語句的執(zhí)行

不可優(yōu)化語句包括DDL浓领、DCL等玉凯。與DML語句不同,它們的處理方式是為每一個類型的語句提供相應的處理函數(shù)联贩。

PostgreSQL在SQL語法解析時漫仆,對于所有的SQL語句都會生成相應的Statement數(shù)據(jù)結(jié)構(gòu)。例如泪幌,SELECT語句有對應的SelectStmt數(shù)據(jù)結(jié)構(gòu)盲厌,CREATE TABLE語句有對應的CreateStmt語句玄渗。解析的結(jié)果就是一個ParseTree的鏈表,鏈上的每一個節(jié)點都是一個Statement的數(shù)據(jù)結(jié)構(gòu)狸眼。

在語義分析階段藤树,會對Statement進行分析轉(zhuǎn)換。具體的轉(zhuǎn)換過程在函數(shù)transformStmt中拓萌,這里不展開敘述岁钓。分析的結(jié)果是將ParseTree轉(zhuǎn)換成便于優(yōu)化器工作的QueryTree。而對于不可優(yōu)化語句微王,在分析階段只是簡單的創(chuàng)建一個Query對象屡限,并將具體的Statement掛載到Query::utilityStmt字段上,并將Query::commandType字段設(shè)置為CMD_UTILITY炕倘。

在查詢重寫階段钧大,不可優(yōu)化語句被直接跳過,不需要重寫罩旋。

在查詢優(yōu)化階段啊央,不可優(yōu)化語句不需要規(guī)劃路徑,被直接掛載到生成的PlannedStmt上涨醋。

因此瓜饥,對于不可優(yōu)化語句,執(zhí)行器得到的計劃樹中只有SQL語法解析后的Statement數(shù)據(jù)結(jié)構(gòu)浴骂。該計劃樹在函數(shù)PortalDefineQuery中被設(shè)置到Portal上乓土。

PortalStart中選擇執(zhí)行策略時,對于不可優(yōu)化語句溯警,只有返回元組時(參見函數(shù)UtilityReturnsTuples)才會選擇PORTAL_UTIL_SELECT,否則選擇PORTAL_MULTI_QUERY趣苏。

PortalRun階段,執(zhí)行流程最終會進入到函數(shù)ProcessUtility中梯轻,對不同的Statement執(zhí)行特定的處理邏輯食磕。

針對各種不同的査詢樹,査詢編譯器在執(zhí)行處理前會做一些額外的處理對査詢樹進行分析檩淋、處理與轉(zhuǎn)換芬为。例如萄金,創(chuàng)建表的語句會用函數(shù)transformCreateStmt進行査詢樹的處理蟀悦。這些處理過程可能會在當前操作之前和之后增加一些新的操作(例如在創(chuàng)建表的操作之前增加創(chuàng)建serial序列表操作、之后增加創(chuàng)建觸發(fā)器用于外鍵約束操作等)氧敢,也可能會執(zhí)行對數(shù)據(jù)結(jié)構(gòu)的處理操作(例如將CreateStmt節(jié)點tableElts字段中CONST_CHECK類型的Constraint節(jié)點轉(zhuǎn)存到CreateStmt的ccmstraints鏈表中等)罩锐。由于這些處理過程會產(chǎn)生一些新的操作枫攀,因此最終會生成一個由多個操作構(gòu)成的鏈表。因此,執(zhí)行過程需要依次掃描該鏈表,為每一個原子操作調(diào)用相應的處理函數(shù)存崖。

下面是創(chuàng)建表進入到執(zhí)行階段時的函數(shù)棧調(diào)用:

transformCreateStmt parse_utilcmd.c:171
ProcessUtilitySlow utility.c:996
standard_ProcessUtility utility.c:923
ProcessUtility utility.c:360
PortalRunUtility pquery.c:1178
PortalRunMulti pquery.c:1324
PortalRun pquery.c:799
exec_simple_query postgres.c:1145
PostgresMain postgres.c:4182
BackendRun postmaster.c:4358
BackendStartup postmaster.c:4030
ServerLoop postmaster.c:1707
PostmasterMain postmaster.c:1380
main main.c:228
start 0x00007fff709083d5

從實現(xiàn)上看,ProcessUtility只作為入口選擇函數(shù),它會根據(jù)輸人的節(jié)點類型調(diào)用相應的處理過程蜗帜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市资厉,隨后出現(xiàn)的幾起案子厅缺,更是在濱河造成了極大的恐慌,老刑警劉巖宴偿,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件湘捎,死亡現(xiàn)場離奇詭異,居然都是意外死亡窄刘,警方通過查閱死者的電腦和手機窥妇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來娩践,“玉大人活翩,你說我怎么就攤上這事》牛” “怎么了纱新?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長穆趴。 經(jīng)常有香客問我脸爱,道長,這世上最難降的妖魔是什么未妹? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任簿废,我火速辦了婚禮,結(jié)果婚禮上络它,老公的妹妹穿的比我還像新娘族檬。我一直安慰自己,他們只是感情好化戳,可當我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布单料。 她就那樣靜靜地躺著,像睡著了一般点楼。 火紅的嫁衣襯著肌膚如雪扫尖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天掠廓,我揣著相機與錄音换怖,去河邊找鬼。 笑死蟀瞧,一個胖子當著我的面吹牛沉颂,可吹牛的內(nèi)容都是我干的条摸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼铸屉,長吁一口氣:“原來是場噩夢啊……” “哼钉蒲!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起彻坛,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤子巾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后小压,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體线梗,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年怠益,在試婚紗的時候發(fā)現(xiàn)自己被綠了仪搔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蜻牢,死狀恐怖烤咧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情抢呆,我是刑警寧澤煮嫌,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站抱虐,受9級特大地震影響昌阿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恳邀,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一懦冰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谣沸,春花似錦刷钢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赋除,卻和暖如春阱缓,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贤重。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工茬祷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人并蝗。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓祭犯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親滚停。 傳聞我的和親對象是個殘疾皇子沃粗,可洞房花燭夜當晚...
    茶點故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容