支援的版本: 目前 (17) / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6

15.4. 平行安全 #

查詢規劃器將查詢中涉及的操作分類為平行安全平行限制平行不安全。平行安全操作是指不會與使用平行查詢衝突的操作。平行限制操作是指無法在平行工作程序中執行的操作,但可以在使用平行查詢時在主導者中執行。因此,平行限制操作永遠不會出現在 GatherGather Merge 節點之下,但可以出現在包含此類節點的計畫中的其他位置。平行不安全操作是指在使用平行查詢時無法執行的操作,即使在主導者中也是如此。當查詢包含任何平行不安全操作時,該查詢的平行查詢將完全停用。

以下操作始終是平行限制的

  • 通用表格運算式 (CTE) 的掃描。

  • 暫存表格的掃描。

  • 外部表格的掃描,除非外部資料包裝器具有 IsForeignScanParallelSafe API 指示其他情況。

  • 參考相關 SubPlan 的計畫節點。

15.4.1. 函數和聚合的平行標記 #

規劃器無法自動判斷使用者定義的函數或聚合是否為平行安全、平行限制或平行不安全,因為這需要預測函數可能執行的每個操作。一般而言,這相當於停機問題,因此不可能。即使對於可以想像得到的簡單函數,我們也不會嘗試,因為這將是昂貴且容易出錯的。相反,除非另有標記,否則所有使用者定義的函數都假定為平行不安全。使用 CREATE FUNCTIONALTER FUNCTION 時,可以透過指定 PARALLEL SAFEPARALLEL RESTRICTEDPARALLEL UNSAFE 來設定標記。使用 CREATE AGGREGATE 時,可以使用 SAFERESTRICTEDUNSAFE 作為對應的值來指定 PARALLEL 選項。

如果函數和聚合會寫入資料庫、變更交易狀態(除了使用子交易進行錯誤復原之外)、存取序列或對設定進行永久性變更,則必須將其標記為 PARALLEL UNSAFE。同樣地,如果函數存取暫存表格、用戶端連線狀態、游標、預備陳述式或系統無法跨工作程序同步的其他後端本機狀態,則必須將其標記為 PARALLEL RESTRICTED。例如,由於最後一個原因,setseedrandom 是平行限制的。

一般而言,如果函數在受限制或不安全時被標記為安全,或者如果它實際上不安全時被標記為受限制,則在平行查詢中使用時可能會拋出錯誤或產生錯誤的答案。C 語言函數理論上可能會表現出完全未定義的行為,如果被錯誤標記,因為系統無法保護自己免受任意 C 程式碼的侵害,但在最有可能的情況下,結果不會比任何其他函數更糟。如果有疑問,最好將函數標記為 UNSAFE

如果平行工作程序中執行的函數取得主導者未持有的鎖定,例如透過查詢未在查詢中參考的表格,則這些鎖定將在工作程序退出時釋放,而不是在交易結束時釋放。如果您編寫執行此操作的函數,並且此行為差異對您很重要,請將此類函數標記為 PARALLEL RESTRICTED,以確保它們僅在主導者中執行。

請注意,查詢規劃器不會考慮延遲評估查詢中涉及的平行限制函數或聚合,以便獲得更好的計畫。因此,例如,如果應用於特定表格的 WHERE 子句是平行限制的,則查詢規劃器不會考慮在計畫的平行部分中執行該表格的掃描。在某些情況下,可以(甚至可能有效)將該表格的掃描包含在查詢的平行部分中,並延遲 WHERE 子句的評估,以便在 Gather 節點之上發生。但是,規劃器不會這樣做。

提交更正

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