Chapter 42. PostgreSQL 內部概貌

Table of Contents
42.1. 查詢經過的路徑
42.2. 聯接是如何建立起來的
42.3. 分析器階段
42.3.1. 分析器
42.3.2. 轉換處理
42.4. PostgreSQL 規則系統
42.5. 規劃器/優化器
42.6. 執行器

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

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

42.1. 查詢經過的路徑

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

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

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

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

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

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

    它(規劃器/優化器)首先創建所有得出相同結果的可能的路徑。 例如,如果待掃描的關系上有一個索引,那麼掃描的路徑就有兩個。 一個可能是簡單的順序查找,而另一個可能就是使用索引的那個。 下一步是計算出每個索引執行的開銷,並且選擇和返回開銷最少的那個。

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

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