執行器(executor) 接受規劃器/最佳化器建立的計畫,並以遞迴方式處理它,以提取所需的列集合。這本質上是一種需求驅動的管線機制。每次呼叫計畫節點時,它必須傳遞更多列,或者報告它已完成傳遞列。
為了提供一個具體範例,假設頂層節點是 MergeJoin
節點。在完成任何合併之前,必須提取兩列(每個子計畫各一列)。因此,執行器遞迴地呼叫自身以處理子計畫(它從連接到 lefttree
的子計畫開始)。新的頂層節點(左子計畫的頂層節點)假設是一個 Sort
節點,並且再次需要遞迴以獲得輸入列。Sort
的子節點可能是一個 SeqScan
節點,代表實際讀取表格。執行此節點會導致執行器從表格中提取一列,並將其返回給呼叫節點。Sort
節點將重複呼叫其子節點以獲得要排序的所有列。當輸入耗盡時(如子節點傳回 NULL 而非列所指示的那樣),Sort
程式碼執行排序,並最終能夠傳回其第一行輸出,即排序順序中的第一行。它保留剩餘的列,以便它可以按照排序順序回應後續的需求。
MergeJoin
節點類似地從其右子計畫要求第一列。然後它比較這兩列以查看它們是否可以聯結;如果可以,它會將聯結列傳回給其呼叫者。在下一次呼叫時,或者如果它無法聯結當前的輸入對,它會前進到一個表格或另一個表格的下一列(取決於比較結果),然後再次檢查是否匹配。最終,一個子計畫或其他子計畫耗盡,並且 MergeJoin
節點傳回 NULL 以指示無法再形成更多的聯結列。
複雜的查詢可能涉及多個層次的計畫節點,但總體方法是相同的:每個節點在每次呼叫時計算並傳回其下一個輸出列。每個節點還負責套用規劃器分配給它的任何選擇或投影表達式。
執行器機制用於評估所有五種基本的 SQL 查詢類型:SELECT
、INSERT
、UPDATE
、DELETE
和 MERGE
。對於 SELECT
,頂層執行器程式碼只需要將查詢計畫樹傳回的每一列發送給用戶端。INSERT ... SELECT
、UPDATE
、DELETE
和 MERGE
實際上是在名為 ModifyTable
的特殊頂層計畫節點下的 SELECT
。
INSERT ... SELECT
將列饋送到 ModifyTable
以進行插入。對於 UPDATE
,規劃器安排每個計算出的列都包含所有更新的欄位值,以及原始目標列的 TID(tuple ID,或列 ID);此資料會饋送到 ModifyTable
節點,該節點使用此資訊來建立新的更新列並標記舊列已刪除。對於 DELETE
,計畫實際傳回的唯一欄位是 TID,ModifyTable
節點僅使用 TID 來存取每個目標列並將其標記為已刪除。對於 MERGE
,規劃器聯結來源和目標關係,並包括任何 WHEN
子句所需的所有欄位值,以及目標列的 TID;此資料會饋送到 ModifyTable
節點,該節點使用此資訊來確定要執行哪個 WHEN
子句,然後根據需要插入、更新或刪除目標列。
簡單的 INSERT ... VALUES
命令會建立一個由單個 Result
節點組成的簡單計畫樹,該節點僅計算一個結果列,並將其饋送到 ModifyTable
以執行插入。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用 此表單 來報告文件問題。