Chapter 40. PostgreSQL 內部概貌

Table of Contents
40.1. 查詢經過的路徑
40.2. 連線是如何建立起來的
40.3. 分析器階段
40.3.1. 分析器
40.3.2. 轉換處理
40.4. PostgreSQL 規則系統
40.5. 規劃器/優化器
40.6. 執行器

作者: 本章最初是 Enhancement of the ANSI SQL Implementation of PostgreSQL 的一部分, 它是 Stefan Simkovics 在維也納理工大學寫的碩士論文, 是由 O.Univ.Prof.Dr. Georg Gottlob和Univ.Ass. Mag. Katrin Seyr 教學的。

本章給出了 PostgreSQL 後端伺服器的內部結構的一個概貌。 在閱讀完畢下面的章節後,您應該對查詢是如何處理的有一個概念了。 本章並不準備提供對 PostgreSQL 內部操作的詳細描述,因為這樣的一份文件將會非常龐大。 本章只是試圖幫助讀者瞭解從後端收到查詢後到結果返回給客戶端之間一般操作順序。

40.1. 查詢經過的路徑

下面是一個簡短的描述,描述一個查詢從開始到得到結果要經過的階段。

  1. 首先必須先建立起從應用程序到 PostgreSQL 伺服器的連線。應用程序向伺服器發送查詢然後接收從伺服器返回的結果。

  2. 分析器階段檢查從應用程序(客戶端)發送過來的查詢, 核對語法並建立一個 查詢樹

  3. 重寫系統接收分析階段來的查詢樹且搜索任何應用到查詢樹上的規則, (規則儲存在系統資料表裡)並根據給出的規則體 進行轉換。

    重寫系統的一個應用就是實現 視圖。 當一個查詢訪問一個視圖時(也就是說,一個虛擬資料表),重寫系統改寫用戶的查詢, 使之成為一個訪問在 視圖定義 裡給出的基本資料表的查詢。

  4. 規劃器/優化器接收(改寫後的)查詢樹然後建立一個查詢規劃, 這個查詢規劃是執行器的輸入。

    它(規劃器/優化器)首先建立所有得出相同結果的可能的路徑。 例如,如果待掃瞄的關係上有一個索引,那麼掃瞄的路徑就有兩個。 一個可能是簡單的順序查找,而另一個可能就是使用索引的那個。 下一步是計算出不同路徑的執行開銷,並且選擇和返回開銷最少的那條。 開銷最小的路徑然後會被展開成為一個可以供執行器使用的完整的查詢規劃。

  5. 執行器遞歸地走過規劃樹並且按照規劃指定的方式檢索資料行。 執行器在對關係進行掃瞄時使用儲存系統, 進行排序連接, 計算 條件並且最終交回生成的資料行。

在隨後的小節裡,我們將對上面的每一個步驟進行更詳細的討論, 以便讓我們對 PostgreSQL 的內部控制和資料結構有一個更準確的理解。