支援的版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3 / 7.2 / 7.1

50.6. 執行器 #

執行器(executor) 接受規劃器/最佳化器建立的計畫,並以遞迴方式處理它,以提取所需的列集合。這本質上是一種需求驅動的管線機制。每次呼叫計畫節點時,它必須傳遞更多列,或者報告它已完成傳遞列。

為了提供一個具體範例,假設頂層節點是 MergeJoin 節點。在完成任何合併之前,必須提取兩列(每個子計畫各一列)。因此,執行器遞迴地呼叫自身以處理子計畫(它從連接到 lefttree 的子計畫開始)。新的頂層節點(左子計畫的頂層節點)假設是一個 Sort 節點,並且再次需要遞迴以獲得輸入列。Sort 的子節點可能是一個 SeqScan 節點,代表實際讀取表格。執行此節點會導致執行器從表格中提取一列,並將其返回給呼叫節點。Sort 節點將重複呼叫其子節點以獲得要排序的所有列。當輸入耗盡時(如子節點傳回 NULL 而非列所指示的那樣),Sort 程式碼執行排序,並最終能夠傳回其第一行輸出,即排序順序中的第一行。它保留剩餘的列,以便它可以按照排序順序回應後續的需求。

MergeJoin 節點類似地從其右子計畫要求第一列。然後它比較這兩列以查看它們是否可以聯結;如果可以,它會將聯結列傳回給其呼叫者。在下一次呼叫時,或者如果它無法聯結當前的輸入對,它會前進到一個表格或另一個表格的下一列(取決於比較結果),然後再次檢查是否匹配。最終,一個子計畫或其他子計畫耗盡,並且 MergeJoin 節點傳回 NULL 以指示無法再形成更多的聯結列。

複雜的查詢可能涉及多個層次的計畫節點,但總體方法是相同的:每個節點在每次呼叫時計算並傳回其下一個輸出列。每個節點還負責套用規劃器分配給它的任何選擇或投影表達式。

執行器機制用於評估所有五種基本的 SQL 查詢類型:SELECTINSERTUPDATEDELETEMERGE。對於 SELECT,頂層執行器程式碼只需要將查詢計畫樹傳回的每一列發送給用戶端。INSERT ... SELECTUPDATEDELETEMERGE 實際上是在名為 ModifyTable 的特殊頂層計畫節點下的 SELECT

INSERT ... SELECT 將列饋送到 ModifyTable 以進行插入。對於 UPDATE,規劃器安排每個計算出的列都包含所有更新的欄位值,以及原始目標列的 TID(tuple ID,或列 ID);此資料會饋送到 ModifyTable 節點,該節點使用此資訊來建立新的更新列並標記舊列已刪除。對於 DELETE,計畫實際傳回的唯一欄位是 TID,ModifyTable 節點僅使用 TID 來存取每個目標列並將其標記為已刪除。對於 MERGE,規劃器聯結來源和目標關係,並包括任何 WHEN 子句所需的所有欄位值,以及目標列的 TID;此資料會饋送到 ModifyTable 節點,該節點使用此資訊來確定要執行哪個 WHEN 子句,然後根據需要插入、更新或刪除目標列。

簡單的 INSERT ... VALUES 命令會建立一個由單個 Result 節點組成的簡單計畫樹,該節點僅計算一個結果列,並將其饋送到 ModifyTable 以執行插入。

提交更正

如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用 此表單 來報告文件問題。