openGauss核心分析2:簡單查詢的執行

liwt_001發表於2022-07-12

上一期酷哥分析了openGauss資料庫的啟動過程,包括主執行緒,輔助執行緒及業務處理執行緒的啟動過程,這一期主要分析簡單查詢語句在業務處理執行緒Postgres上的執行流程,並介紹如何利用gdb梳理程式碼邏輯。

簡單查詢的執行

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語句即可開始除錯


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70019768/viewspace-2905299/,如需轉載,請註明出處,否則將追究法律責任。

相關文章