時間一晃周末就過完了,時間過得太快,不由得讓人倍加珍惜。時間真是不夠用哈~
好的不廢話,這次我們開始看查詢規(guī)劃模塊的源碼吧。
查詢規(guī)劃部分的在整個查詢處理模塊應(yīng)該是在一個非常重要的地位上,這一步直接決定了查詢的方式與路徑,很大程度上影響了數(shù)據(jù)庫查詢的查詢性能。因此這一塊代碼量也很大,我也會花較多的筆墨來分析這個模塊的代碼。在篇幅上,可能查詢規(guī)劃這一模塊我會用2到3篇文章來細細的說明下。今天這一篇先總體概述下查詢規(guī)劃模塊的全貌,在介紹該模塊的一個重要的子模塊(總共三個主要模塊)就結(jié)束吧,剩下的交給第二篇吧。
1.查詢規(guī)劃模塊總體概況
廢話不多說,我先上圖。下圖大概的刻畫了查詢規(guī)劃模塊里主要的函數(shù)調(diào)用關(guān)系,當(dāng)然啦,最下層只畫到主處理函數(shù),主處理函數(shù)內(nèi)部的調(diào)用關(guān)系在介紹每個主處理函數(shù)的時候再細細的說吧。
我簡單介紹下吧。exec_simple_query函數(shù)是負(fù)責(zé)查詢處理的主函數(shù),在進行查詢規(guī)劃之前,它已經(jīng)調(diào)用了查詢分析和查詢重寫模塊。還記得上一篇博文的查詢重寫模塊么?該模塊返回的是重寫后的查詢樹鏈表。這里exec_simple_query函數(shù)將重寫后的查詢樹鏈表交給查詢規(guī)劃模塊進一步處理。查詢規(guī)劃模塊的入口函數(shù)是pg_plan_queries函數(shù)。
pg_plan_queries函數(shù)調(diào)用pg_plan_query函數(shù)對每一個查詢進行處理并返回PlannedStmt(執(zhí)行計劃)結(jié)構(gòu)體鏈表。這里要注意,查詢規(guī)劃模塊只會對非UTILITY命令進行處理。
而在pg_plan_query函數(shù)里,實際是調(diào)用planner函數(shù)負(fù)責(zé)查詢計劃的生成。
planner函數(shù)調(diào)用standard_planner函數(shù)進入標(biāo)準(zhǔn)的查詢規(guī)劃處理流程。該函數(shù)接受查詢樹以及相關(guān)參數(shù),返回PlannedStmt結(jié)構(gòu)體,詳細的結(jié)構(gòu)如下:
typedef struct PlannedStmt
{
NodeTag type;
CmdType commandType; /* select|insert|update|delete */ uint32 queryId;
網(wǎng)友評論