openGauss內核:簡單查詢的執行

摘要:本文主要分析簡單查詢語句在業務處理線程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語句即可開始調試

 

點擊關注,第一時間瞭解華爲雲新鮮技術~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章