Postgresql

PostgreSQL 函式並行安全是否適用於更新數據的函式?

  • March 20, 2020

我在理解函式並行安全時遇到了一些麻煩。我可以理解它的作用——即指定函式是否將由並行主節點執行,或者查詢是否將完全禁用並行性。

但我很難理解何時使用它。讓我舉個例子吧。假設我有一個只創建表而不更新任何數據或插入任何行的函式。這個的並行安全應該標記為什麼?我想將其標記為並行安全,但後來我不明白為什麼手冊會將以下內容列為並行受限:

  • 公用表表達式 (CTE) 的掃描。
  • 掃描臨時表。

由於這兩點不一定涉及任何數據更新/插入(競爭條件)?

CTE 的情況特別奇怪。我知道如果我在 CTE 呼叫中添加一個並行安全函式,它將不再作為並行安全執行?而且,在功能並行安全之外,我理解所有 CTE 都作為並行受限執行?這裡物化和未物化的 CTE 有區別嗎?

原因是 CTE 和臨時表對於創建它們的後端程序都是私有的,而並行工作程序是不同的程序,它們無法訪問領導程序的私有資源。

為了使 CTE 掃描並行安全,CTE 必須在共享記憶體中實現。

我會小心地將創建表的函式標記為並行安全,因為這會在數據庫中創建鎖。你能保證永遠不會有任何衝突,以便你的工作程序相互鎖定嗎?

假設我有一個只創建表而不更新任何數據或插入任何行的函式

創建表必須將行插入系統目錄。這個函式是並行不安全的。

引用自:https://dba.stackexchange.com/questions/262340