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原始碼
- CoreData執行過程的sql語句SQL
- 剖析SQL語句的執行過程SQL
- Oracle SQL 語句的執行過程OracleSQL
- MySQL全文索引原始碼剖析之Insert語句執行過程MySql索引原始碼
- mysql執行sql語句過程MySql
- Mybatis原始碼分析(五)探究SQL語句的執行過程MyBatis原始碼SQL
- 一條sql語句的執行過程SQL
- 淺談SQL語句的執行過程SQL
- 理解oracle執行sql語句的過程OracleSQL
- [20170703]SQL語句分析執行過程.txtSQL
- SQL語句執行過程詳解SQL
- sql語句執行過程小結SQL
- 快速執行大量 insert 語句的方法
- 10_SQL語句執行過程剖析SQL
- 分析執行計劃優化SQLSQL語句處理的過程(轉)優化SQL
- 通過分析SQL語句的執行計劃優化SQL語句SQL優化
- 分析執行計劃最佳化SQLSQL語句處理的過程(轉)SQL
- MySQL 查詢語句執行過程淺析MySql
- [zebra原始碼]分片語句ShardPreparedStatement執行過程原始碼
- Oracle資料庫SQL語句執行過程Oracle資料庫SQL
- GaussDB SQL查詢語句執行過程解析SQL
- ORACLE sql 語句的執行過程(SQL效能調整)OracleSQL
- MySQL中UPDATE語句裡SET後使用AND的執行過程和結果分析MySql
- 在.NET中用儲存過程執行SQL語句儲存過程SQL
- PostgreSQL獲取建表語句儲存過程SQL儲存過程
- HiveSQL的執行過程分析HiveSQL
- MySQL語句執行分析(一)MySql
- MySQL語句執行分析(二)MySql
- MySQL探祕(二):SQL語句執行過程詳解MySql
- MySQL系列之一條SQL查詢語句的執行過程MySql
- sql執行過程分析SQL
- 小覷資料庫(SqlServer)查詢語句執行過程資料庫SQLServer
- sql語句執行緩慢分析SQL
- 通過分析SQL語句的執行計劃優化SQL 二SQL優化
- 【Gp】PostgreSql中如何kill掉正在執行的sql語句SQL
- 程式語言執行過程
- 用儲存過程把表裡的資料導成insert語句儲存過程