PostgreSQL Select源碼解析
這張時序圖比較大,但是大致上描述了PG 處理簡單SQL的大致流程。
由用戶端發起SQL 陳述式,PG服務端進程backend接收到語句後,開始執行exec_simple_query()代碼。後面所有方法調用均有exec_simple_query()函數直接或者間接發起。
大體上分為以下幾個過程:pg_parse_query()->pg_analyze_and_rewrite()->pg_plan_queries()->… ExecutePlan() … ->pg_report_stat()。
pg_parse_query
只是簡單的產生raw parse tree,這個裡面不涉及語義檢查。只是做文法掃描,是一個Bison parser。
pg_analyze_and_rewrite
這塊會進行語義分析,會訪問資料庫中的對像,需要持有鎖。這個過程會將簡單的一個select 語句拆分成多個部分,將parse tree轉換成query tree。如將整個select語句轉換成:from 部分,
where條件部分,group by 部分,order by 部分以及having 部分等。是任何資料庫都需要操作的,並且非常重要的一環。
pg_plan_queries
在這個環節,將根據上面的query tree產生執行計畫。這部分核心代碼在planner.c中,是PG的Query Optimizer。會根據表和索引的統計資訊去計算不同路徑的可能代價值,最後選出最優者。
這裡先不展開,後面會寫文章,專門講這塊,即“PG 的Cost-based Optimizer原理”。
ExecutePlan
執行plan,它會遍曆每個節點,以致完成。最後將查詢結果返回給用戶端。
pg_report_stat
將統計資訊發送給collector。比如說表和索引掃描了多少次,返回多少記錄等。如果是DML語句,還會有增刪除改多少記錄的統計資訊。原始資訊以表為維度,後面匯總到庫層級或者執行個體層級。
這對於健全狀態檢查或者監控PG的效能有非常重要的作用。
從下面時序圖中,可以看出,每個源碼檔案的任務非常清晰。
postgres.c: 為backend進程,負責打雜和調度,是與用戶端對應的server進程。因為PG是C/S架構的,每個用戶端串連到PG後,postmaster都會fork出一個backend進程與之進行互動。
xact.c:是與事務相關的操作。事務的狀態標誌,隔離等級,是否有嵌套事務等。
utility.c: 語句或者命令的類型,主要包含delete,insert,update,select,explain,create,alter等。
execMain.c:是執行語句的總調度入口。
pgstat.c:負責資料庫統計收集和展示。
portalmem.c:負責語句執行時,記憶體申請與釋放。PG中,專門取了一個名字叫portal,相當於workspace。
------------------------------------華麗麗的分割線------------------------------------
CentOS 6.3環境下yum安裝PostgreSQL 9.3
PostgreSQL緩衝詳述
Windows平台編譯 PostgreSQL
Ubuntu下LAPP(Linux+Apache+PostgreSQL+PHP)環境的配置與安裝
Ubuntu上的phppgAdmin安裝及配置
CentOS平台下安裝PostgreSQL9.3
PostgreSQL配置Streaming Replication叢集
如何在CentOS 7/6.5/6.4 下安裝PostgreSQL 9.3 與 phpPgAdmin
------------------------------------華麗麗的分割線------------------------------------
PostgreSQL 的詳細介紹:請點這裡
PostgreSQL 的:請點這裡
本文永久更新連結地址: