PostgreSQL SQL執行流程
每種資料庫都有自己的SQL執行流程圖,PostgreSQL也不例外。下面這張圖基本上概括了PG處理SQL的整個邏輯。我下面分開來細講一下:
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語句。由此可見,這個程式碼的重要性。
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- postgresql怎麼執行sqlSQL
- SQL 解析與執行流程SQL
- mysql的sql語句執行流程MySql
- 用PostgreSQL執行檔案中的SQL程式SQL
- 【Gp】PostgreSql中如何kill掉正在執行的sql語句SQL
- PostgreSQL 查詢當前執行中sql的執行計劃——pg_show_plans模組SQL
- Mysql 執行流程MySql
- HA執行流程
- MapReduce執行流程
- php執行流程PHP
- MyBatis執行流程MyBatis
- oracle常用後臺程序及sql語句執行流程OracleSQL
- Oracle SQL語句執行流程與順序原理解析OracleSQL
- 「MySQL」 MySQL執行流程MySql
- SpringMVC執行流程SpringMVC
- MapReduce程式執行流程
- javaWeb的執行流程JavaWeb
- Struts框架執行流程框架
- PostgreSQL執行計劃變化SQL
- PHP執行流程回顧PHP
- MapReduce的執行流程概述
- thinkphp3.2 執行流程PHP
- 框架執行流程總結框架
- Ansible playbook 執行流程
- angularjs基本執行流程AngularJS
- java的執行流程(轉)Java
- Dapr Outbox 執行流程
- 執行流程原始碼分析原始碼
- Spark學習(一)——執行模式與執行流程Spark模式
- 深入理解執行緒池的執行流程執行緒
- MyBatis SQL執行MyBatisSQL
- [ORACLE] SQL執行OracleSQL
- SQL的執行SQL
- PHP執行sqlPHPSQL
- 原始碼解析MyBatis Sharding-Jdbc SQL語句執行流程詳解(文末有流程圖)原始碼MyBatisJDBCSQL流程圖
- PostgreSQL的vacuum流程SQL
- SQL 執行 - 執行器最佳化SQL
- 一次搞定各種資料庫SQL執行計劃:MySQL、Oracle、SQL Server、PostgreSQL以及SQLite資料庫MySqlOracleServerSQLite