PostgreSQL SQL執行流程

jesselyu發表於2015-06-28

       每種資料庫都有自己的SQL執行流程圖,PostgreSQL也不例外。下面這張圖基本上概括了PG處理SQL的整個邏輯。我下面分開來細講一下:

image

 

1.Main

Main是整個後臺的入口,基本上不處理任何邏輯,只是簡單的分發處理邏輯。

但是像檢查當前使用者是否是”root”,還是會做的。因為我們知道,root使用者是不能起動PG server的。

2.Postmaster

著名的postmaster 後臺程式就是由此程式碼實現的。這個程式碼封裝了PG所有後臺程式的入口。這裡為什麼只是說“入口”呢,因為實現由各自的程式碼檔案實現。這裡不

負責。如像checkpoint程式,bgwriter程式,wal writer程式,autovacuum laucner程式,stats collector程式以及archiver程式等。這些程式都是有postmaster

fork出來。另外postgres使用者程式,vacuum worker程式等也是由postmaster程式負責fork。除此之外,postmaster 還負責監聽使用者請求,將使用者請求從監聽埠中

接收過來,fork出一個postgres程式,專門負責處理使用者SQL語句。由此可見,這個程式碼的重要性。

image

3.postgres

postgres是使用者程式,專門負責處理使用者請求。也就是通常所說的backend程式。使用者終端在上一步postmaster fork出postgres backend程式後,直接與此postgres 程式互動。

無論是後臺程式還是backend 程式,都由postmaster來維護。postmaster在全域性級別維護了一個陣列,為每個程式分配一個slot。

4.Parse statement

postgres程式被fork後,接受使用者並處理使用者語句。因此這裡首先會識別使用者所發出的語句。如insert,delete,update,select等DML語句,另外還有如create table,create index等DDL語句。

只是識別語句的型別,並不會做其他任何處理。然後由traffic cop 程式碼塊進行分發。

5.traffic corp

這步最主要的使用就是根據不的語句型別分發到不同程式碼進行處理。所以稱作為traffic corp,也就是交通協調疏導的意思。如果是DML語句或者是select 語句,都屬於QUERY,進入QUERY處理

邏輯。如果是DDL語句,那麼屬於Utility Command,進入Utility Command處理邏輯。因為DDL與DML的處理邏輯是非常不一樣的。

6.Query Rewrite & Generate Path

進入QUERY邏輯後,接著就是rewrite動作。rewrite就是改寫SQL語句並將使用者請求的SQL做一些簡單的最佳化處理。PG的語法和語義檢查,是在這裡做的。具體來講,這段程式碼由execute_simple_query

方法來實現。先進行raw parse,簡單的將語句進行分析,生成parse tree,也就是語法樹。後面再經過analyze和rewrite,生成query tree,即查詢樹。查詢樹的生成需要進行語義檢查。

會檢查資料庫物件,因此會有上鎖的邏輯。這一步會呼叫optimizer,並根據cost選擇一種最優的執行路徑。

8.Generate Plan

根據最優路徑,生成執行計劃和執行樹。

9.Execute Plan

執行執行樹的每個node,最終返回結果給使用者terminal。到這裡整個執行邏輯基本上就是結束了。

 

    從上面看來,是否跟Oracle非常像。只是Oracle把監聽的功能獨立出來,放到listener中了,這有利於整個系統的穩定性。另外上面圖中還列許多其它的程式碼塊,如Catalog,Storage Manager,

Access Method等。Catalog主要是負責資料字典和後設資料管理。Storage Manager負責儲存介質管理,實現了將buffer page對映到物理磁碟上的檔案,同步快取與磁碟檔案等功能。

Access Method主要實現了訪問路徑的實現,如index scan, heap scan等。

   PG是基於程式架構的,因此每個使用者請求在後臺都有一個專門的backend程式與之對應。與MySQL基於執行緒架構的區別以及優缺點,相必大家也比較清楚。總體上來講,基於程式架構的系統更穩定;

但是連線記憶體開銷上會大些。基於程式架構的系統,在原始碼開發以及記憶體變數處理上比較複雜些。多程式IPC通訊處理等,需要額外關注比較多。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30088583/viewspace-1715489/,如需轉載,請註明出處,否則將追究法律責任。

相關文章