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
- Mybatis簡單查詢MyBatis
- 簡單的查詢語法
- java中資料庫查詢,搭配簡單的圖形介面進行查詢Java資料庫
- [轉帖]SQL Server簡潔查詢正在執行的程序SQLServer
- MySQL的簡單查詢語句MySql
- 插值查詢的簡單理解
- sql查詢是如何執行的?SQL
- 多執行緒查詢執行緒
- 簡單分析ThreadPoolExecutor回收工作執行緒的原理thread執行緒
- MogDB openGauss常用查詢彙總
- openGauss核心:SQL解析過程分析SQL
- SpringBoot 框架MongoDB 簡單的查詢方式Spring Boot框架MongoDB
- 二分查詢的簡單理解
- SSM的查詢簡單練習+JSPSSMJS
- ATM-簡單SQL查詢SQL
- pgrep查詢正在執行的程式ID
- explain 查詢執行計劃AI
- Spring Data Jpa 的簡單查詢多表查詢HQL,SQL ,動態查詢, QueryDsl ,自定義查詢筆記SpringSQL筆記
- MySQL 查詢常用操作(0) —— 查詢語句的執行順序MySql
- 簡單的執行緒池執行緒
- 聊聊簡單又不簡單的圖上多跳過濾查詢
- 嘗試讓查詢更簡單
- mysql查詢快取簡單使用MySql快取
- 簡單分析執行緒獲取ReentrantReadWriteLock 讀鎖的規則執行緒
- 一條查詢語句的執行流程
- MySQL學習 - 查詢的執行過程MySql
- Laravel 框架查詢執行的 SQL 語句Laravel框架SQL
- C# Linq 延遲查詢的執行C#
- 全國省市區地址查詢API:簡單易用的地址查詢服務API
- 從簡單程式碼入手,分析執行緒池原理執行緒
- 多執行緒查詢,效率翻倍執行緒
- Mysql-基本練習(09-刪除單表記錄、查詢指定列資料、列的別名、簡單單表條件查詢、簡單分組查詢)MySql
- openGauss SQL引擎(下)——查詢最佳化SQL