openGauss核心分析2:簡單查詢的執行
上一期酷哥分析了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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- openGauss核心分析(八):執行運算元探究
- openGauss核心分析(七):SQL by pass & 經典執行器SQL
- 用於對執行慢的查詢進行分析的清單
- 簡單的查詢
- 對 MySQL 慢查詢日誌的簡單分析MySql
- 簡單的mysql查詢MySql
- MySQL - 資料查詢 - 簡單查詢MySql
- java中資料庫查詢,搭配簡單的圖形介面進行查詢Java資料庫
- Mybatis簡單查詢MyBatis
- 簡單的查詢語法
- ElasticSearch中的簡單查詢Elasticsearch
- [轉帖]SQL Server簡潔查詢正在執行的程序SQLServer
- MySQL的簡單查詢語句MySql
- 插值查詢的簡單理解
- 一個簡單的樹查詢
- 關於查詢轉換的一些簡單分析(一)
- 關於查詢轉換的一些簡單分析(二)
- 關於查詢轉換的一些簡單分析(三)
- 關聯查詢子查詢效率簡單比照
- SQL Server簡潔查詢正在執行SQL(等待事件)SQLServer事件
- #查詢演算法#【1】簡單查詢:順序、折半查詢演算法
- 多執行緒查詢執行緒
- sql查詢是如何執行的?SQL
- oracle 正在執行的物件查詢Oracle物件
- ATM-簡單SQL查詢SQL
- 二分查詢的簡單理解
- MySQL之資料的簡單查詢MySql
- 一個簡單的字串查詢程式字串
- openGauss核心:SQL解析過程分析SQL
- MogDB openGauss常用查詢彙總
- MySQL 查詢處理 SQL查詢執行順序MySql
- 簡單分析ThreadPoolExecutor回收工作執行緒的原理thread執行緒
- pgrep查詢正在執行的程式ID
- 查詢執行慢的SQL語句SQL
- 一條查詢sql的執行之路SQL
- 查詢正在執行的SQL語句SQL
- explain 查詢執行計劃AI
- 查詢linux的核心版本和發行版本Linux