天天看點

openGauss核心分析(二):簡單查詢的執行

作者:liwt

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

簡單查詢的執行

SQL引擎是資料庫系統的入口,執行使用者簡單查詢的入口函數是exec_simple_query。運作在業務處理線程Postgres。

通常可以把SQL引擎分成SQL解析和查詢優化兩個主要的子產品,SQL引擎對輸入的SQL語言進行詞法分析、文法分析、語義分析,進而生成邏輯執行計劃,邏輯執行計劃經過代數優化和代價優化之後,産生實體執行計劃。

在SQL引擎将使用者的查詢解析優化成可執行的計劃之後,資料庫進入查詢執行階段。執行器基于執行計劃對相關資料進行提取、運算、更新、删除等操作,以達到使用者查詢想要實作的目的。

openGauss核心分析(二):簡單查詢的執行

exec_simple_query

openGauss核心分析(二):簡單查詢的執行

1.start_xact_command():開始一個事務

2.pg_parse_query():對查詢語句進行詞法和文法分析,生成一個或者多個初始的文法分析樹

3. 進入foreach (parsetree_item, parsetree_list)循環,對每個文法分析樹執行查詢

4. pg_analyze_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可以檢視線程調用棧

openGauss核心分析(二):簡單查詢的執行

也可以使用linux工具gstack 列印函數調用棧

openGauss核心分析(二):簡單查詢的執行

以調試select語句為例,gdb attach 程序号,在exec_simple_query打上斷點,執行select語句即可開始調試

openGauss核心分析(二):簡單查詢的執行
openGauss核心分析(二):簡單查詢的執行
openGauss核心分析(二):簡單查詢的執行

繼續閱讀