PostgreSQL的insert語句執行過程分析
在資料庫的使用中,增刪改查這種操作每天都在進行,本文通過gdb工具演示了一個insert語句的執行流程。
一、gdb增加斷點
開啟一個session,獲取pid
另開一個視窗,用gdb進入除錯狀態
資料庫端執行插入操作,因為gdb繫結了pid,會卡住,直到隨著gdb的除錯過程,執行到真正插入動作的函式
我在gdb端加了總共四個斷點
二、執行到exec_simple_query()
先從當前位置開始連續執行程式,到第一個斷點,從下往上看執行的堆疊:
可以看到,insert動作從main()函式開始,首先到了postmaster程式入口 PostmasterMain() ,通過ServerLoop() 監聽session連線並fork postgres子程式 ,然後用BackendStartup()啟動backend程式 ,之後到PostgresMain() 即backend的入口,通過子程式backend獲取sql語句 ,並最終到了exec_simple_query() 即SQL引擎的入口。
可以在此時檢視傳入這裡的引數
單步執行,檢視執行過程中相關變數的值。
三、執行到ProcessQuery()
c繼續執行,在下一個斷點,即ProcessQuery()這裡停下,檢視堆疊,可以看到這一部分跑到了PortalRun()的入口,Portal是查詢執行器的四個主要子模組之一,也通常被叫做策略選擇模組,在這選擇執行策略後,會將控制流程交給相應的處理部件,即Executer或者ProcessUtility。這裡根據策略呼叫了PortalRunMulti() ,最後到達了ProcessQuery()。
我們繼續單步執行,ProcessQuery()在這一部分建立QueryDesc,它封裝了執行器執行查詢所需的所有內容 ,呼叫ExecutorStart函式初始化結構體EState ,ExecutorStart函式呼叫InitPlan初始化計劃狀態樹 。
這一部分執行流程過程如黃色所示:
四、執行到standard_ExecutorRun()
繼續c執行,到了standard_ExecutorRun(),這裡是先通過ExecutorRun ()這裡進行判斷,如果有hook函式,就執行hook函式,沒有的話,執行標準函式standard_ExecutorRun()。(比較典型的使用hook的是pg_show_plans外掛)
繼續執行,最後通過standard_ExecutorRun()的ExecutePlan()執行insert並通過MemoryContextSwitchTo()切換回原記憶體上下文。
c繼續執行一直到結束
可以在資料庫端看到資料成功插入
整個插入動作的堆疊如下:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2871958/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- PostgreSQL 原始碼解讀(15)- Insert語句(執行過程跟蹤)SQL原始碼
- MySQL全文索引原始碼剖析之Insert語句執行過程MySql索引原始碼
- mysql執行sql語句過程MySql
- Mybatis原始碼分析(五)探究SQL語句的執行過程MyBatis原始碼SQL
- 一條sql語句的執行過程SQL
- 分析執行計劃優化SQLSQL語句處理的過程(轉)優化SQL
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- GaussDB SQL查詢語句執行過程解析SQL
- MySQL 查詢語句執行過程淺析MySql
- [zebra原始碼]分片語句ShardPreparedStatement執行過程原始碼
- MySQL中UPDATE語句裡SET後使用AND的執行過程和結果分析MySql
- PostgreSQL獲取建表語句儲存過程SQL儲存過程
- MySQL語句執行分析(一)MySql
- MySQL語句執行分析(二)MySql
- MySQL探祕(二):SQL語句執行過程詳解MySql
- MySQL系列之一條SQL查詢語句的執行過程MySql
- insert all和insert first語句的用法
- SQLite Insert 語句SQLite
- sql語句執行緩慢分析SQL
- 程式語言執行過程
- 深入解讀MySQL InnoDB儲存引擎Update語句執行過程MySql儲存引擎
- insert into select語句與select into from語句
- PostgreSQL 原始碼解讀(14)- Insert語句(如何構造PlannedStmt)SQL原始碼
- mysql中一條查詢語句的執行全過程是怎樣的?MySql
- 原始碼分析OKHttp的執行過程原始碼HTTP
- [20181120]奇怪的insert語句.txt
- crtmpserver 執行過程簡明分析Server
- Informix 執行緒sleep 分析過程ORM執行緒
- [20181119]sql語句執行緩慢分析.txtSQL
- 【SQL】9 SQL INSERT INTO 語句SQL
- sql語句如何執行的SQL
- python中try語句的工作過程Python
- SAP Spartacus 裡的 cxOutletRef 指令執行過程分析
- 教你使用SQLite-insert語句SQLite
- mySQL 執行語句執行順序MySql
- [求指導] 如何通過程式碼分析一個查詢語句的執行效率
- javascript引擎執行的過程的理解--語法分析和預編譯階段JavaScript語法分析編譯
- 查詢Oracle正在執行的sql語句及執行該語句的使用者OracleSQL