摘要:本文主要分析簡單查詢語句在業務處理線程Postgres上的執行流程,並介紹如何利用gdb梳理代碼邏輯。
本文分享自華爲雲社區《openGauss內核分析(二):簡單查詢的執行》,作者:Gauss松鼠會。
簡單查詢的執行
SQL引擎是數據庫系統的入口,執行用戶簡單查詢的入口函數是exec_simple_query。運行在業務處理線程Postgres。
通常可以把SQL引擎分成SQL解析和查詢優化兩個主要的模塊,SQL引擎對輸入的SQL語言進行詞法分析、語法分析、語義分析,從而生成邏輯執行計劃,邏輯執行計劃經過代數優化和代價優化之後,產生物理執行計劃。
在SQL引擎將用戶的查詢解析優化成可執行的計劃之後,數據庫進入查詢執行階段。執行器基於執行計劃對相關數據進行提取、運算、更新、刪除等操作,以達到用戶查詢想要實現的目的。
exec_simple_query
1.start_xact_command():開始一個事務
2.pg_parse_query():對查詢語句進行詞法和語法分析,生成一個或者多個初始的語法分析樹
3. 進入foreach (parsetree_item, parsetree_list)循環,對每個語法分析樹執行查詢
4. pg_**yze_and_rewrite():根據語法分析樹生成基於Query數據結構的邏輯查詢樹,並進行重寫等操作
5. pg_plan_queries():對邏輯查詢樹進行優化,生成查詢計劃
6. CreatePortal():創建Portal, Portal是執行SQL語句的載體,每一條SQL對應唯一的Portal
7. PortalStart():負責進行Portal結構體初始化工作,包括執行算子初始化、內存上下文分配等
8. PortalRun():負責真正的執行和運算,它是執行器的核心
9. PortalDrop():負責最後的清理工作,主要是數據結構、緩存的清理
10. finish_xact_command():完成事務提交
11. EndCommand():通知客戶端查詢執行完成
gdb調試
調試需要用到符號信息,configure使用如下命令
./configure --gcc-version=7.3.0 CC=g++ CFLAGS='-O0' --prefix=$GAUSSHOME --3rd=$BINARYLIBS --enable-debug --enable-cassert --enable-thread-safety --with-readline --without-zlib
gdb attach 進程號,這裏進程號爲17012
gdb attach 17012
info threads查看所有線程,t 線程號切換線程,bt可以查看線程調用棧
也可以使用linux工具gstack 打印函數調用棧
以調試select語句爲例,gdb attach 進程號,在exec_simple_query打上斷點,執行select語句即可開始調試