openGauss內(nèi)核分析(二):簡單查詢的執(zhí)行
上一期酷哥分析了openGauss數(shù)據(jù)庫的啟動過程,包括主線程,輔助線程及業(yè)務處理線程的啟動過程,這一期主要分析簡單查詢語句在業(yè)務處理線程Postgres上的執(zhí)行流程,并介紹如何利用gdb梳理代碼邏輯。
???簡單查詢的執(zhí)行
SQL引擎是數(shù)據(jù)庫系統(tǒng)的入口,執(zhí)行用戶簡單查詢的入口函數(shù)是exec_simple_query。運行在業(yè)務處理線程Postgres。
通??梢园裇QL引擎分成SQL解析和查詢優(yōu)化兩個主要的模塊,SQL引擎對輸入的SQL語言進行詞法分析、語法分析、語義分析,從而生成邏輯執(zhí)行計劃,邏輯執(zhí)行計劃經(jīng)過代數(shù)優(yōu)化和代價優(yōu)化之后,產(chǎn)生物理執(zhí)行計劃。
在SQL引擎將用戶的查詢解析優(yōu)化成可執(zhí)行的計劃之后,數(shù)據(jù)庫進入查詢執(zhí)行階段。執(zhí)行器基于執(zhí)行計劃對相關(guān)數(shù)據(jù)進行提取、運算、更新、刪除等操作,以達到用戶查詢想要實現(xiàn)的目的。

???exec_simple_query

1.start_xact_command():開始一個事務。
2.pg_parse_query():對查詢語句進行詞法和語法分析,生成一個或者多個初始的語法分析樹。
3. 進入foreach (parsetree_item, parsetree_list)循環(huán),對每個語法分析樹執(zhí)行查詢。
4. pg_analyze_and_rewrite():根據(jù)語法分析樹生成基于Query數(shù)據(jù)結(jié)構(gòu)的邏輯查詢樹,并進行重寫等操作。
5. pg_plan_queries():對邏輯查詢樹進行優(yōu)化,生成查詢計劃。
6. CreatePortal():創(chuàng)建Portal, Portal是執(zhí)行SQL語句的載體,每一條SQL對應唯一的Portal。
7. PortalStart():負責進行Portal結(jié)構(gòu)體初始化工作,包括執(zhí)行算子初始化、內(nèi)存上下文分配等。
8. PortalRun():負責真正的執(zhí)行和運算,它是執(zhí)行器的核心。
9. PortalDrop():負責最后的清理工作,主要是數(shù)據(jù)結(jié)構(gòu)、緩存的清理。
10. finish_xact_command():完成事務提交。
11. EndCommand():通知客戶端查詢執(zhí)行完成。
???gdb調(diào)試
調(diào)試需要用到符號信息,configure使用如下命令
gdb attach 進程號,這里進程號為17012
info threads查看所有線程,t 線程號切換線程,bt可以查看線程調(diào)用棧。

也可以使用linux工具gstack 打印函數(shù)調(diào)用棧。

以調(diào)試select語句為例,gdb attach?進程號,在exec_simple_query打上斷點,執(zhí)行select語句即可開始調(diào)試


