W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
規(guī)劃器把查詢中涉及的操作分類成并行安全、并行受限或者并行不安全。并行安全的操作不會(huì)與并行查詢的使用產(chǎn)生沖突。并行受限的操作不能在并行工作者中執(zhí)行,但是能夠在并行查詢的領(lǐng)導(dǎo)者中執(zhí)行。因此,并行受限的操作不能出現(xiàn)在Gather
或者Gather Merge
節(jié)點(diǎn)之下,但是能夠出現(xiàn)在包含這類節(jié)點(diǎn)的計(jì)劃的其他位置。并行不安全的操作不能在并行查詢中執(zhí)行,甚至不能在領(lǐng)導(dǎo)者中執(zhí)行。當(dāng)一個(gè)查詢包含任何并行不安全操作時(shí),并行查詢對(duì)這個(gè)查詢是完全被禁用的。
下面的操作總是并行受限的。
公共表表達(dá)式(CTE)的掃描。
臨時(shí)表的掃描。
外部表的掃描,除非外部數(shù)據(jù)包裝器有一個(gè)IsForeignScanParallelSafe
API。
InitPlan
所掛接到的計(jì)劃節(jié)點(diǎn)。
引用一個(gè)相關(guān)的SubPlan
的計(jì)劃節(jié)點(diǎn)。
規(guī)劃器無法自動(dòng)判定一個(gè)用戶定義的函數(shù)或者聚集是并行安全、并行受限還是并行不安全,因?yàn)檫@需要預(yù)測(cè)函數(shù)可能執(zhí)行的每一個(gè)操作。一般而言,這就相當(dāng)于一個(gè)停機(jī)問題,因此是不可能的。甚至對(duì)于可以做到判定的簡(jiǎn)單函數(shù)我們也不會(huì)嘗試,因?yàn)槟菚?huì)非常昂貴而且容易出錯(cuò)。相反,除非是被標(biāo)記出來,所有用戶定義的函數(shù)都被認(rèn)為是并行不安全的。在使用CREATE FUNCTION或者
ALTER FUNCTION
時(shí),可以通過指定PARALLEL SAFE
、PARALLEL RESTRICTED
或者PARALLEL UNSAFE
來設(shè)置標(biāo)記 。在使用CREATE AGGREGATE時(shí),
PARALLEL
選項(xiàng)可以被指定為SAFE
、RESTRICTED
或者 UNSAFE
。
如果函數(shù)和聚集會(huì)寫數(shù)據(jù)庫(kù)、訪問序列、改變事務(wù)狀態(tài)(即便是臨時(shí)改變,例如建立一個(gè)EXCEPTION
塊來捕捉錯(cuò)誤的 PL/pgsql)或者對(duì)設(shè)置做持久化的更改,它們一定要被標(biāo)記為PARALLEL UNSAFE
。類似地,如果函數(shù)會(huì)訪問臨時(shí)表、客戶端連接狀態(tài)、游標(biāo)、預(yù)備語句或者系統(tǒng)無法在工作者之間同步的后端本地狀態(tài),它們必須被標(biāo)記為PARALLEL RESTRICTED
。例如,
setseed
和 random
由于后一種原因而是并行受限的。
一般而言,如果一個(gè)函數(shù)是受限或者不安全的卻被標(biāo)記為安全,或者它實(shí)際是不安全的卻被標(biāo)記為受限,把它用在并行查詢中時(shí)可能會(huì)拋出錯(cuò)誤或者產(chǎn)生錯(cuò)誤的回答。如果 C 語言函數(shù)被錯(cuò)誤標(biāo)記,理論上它會(huì)展現(xiàn)出完全不明確的行為,因?yàn)橄到y(tǒng)中無法保護(hù)自身不受任意 C 代碼的影響。但是,在最有可能的情況下,結(jié)果不會(huì)比其他任何函數(shù)更糟糕。如果有疑慮,最好還是標(biāo)記函數(shù)為UNSAFE
。
如果在并行工作者中執(zhí)行的函數(shù)要求領(lǐng)導(dǎo)者沒有持有的鎖,例如讀該查詢中沒有引用的表,那么工作者退出時(shí)會(huì)釋放那些鎖(而不是在事務(wù)結(jié)束時(shí)釋放)。如果你寫了一個(gè)這樣做的函數(shù)并且這種不同的行為對(duì)你很重要,把這類函數(shù)標(biāo)記為PARALLEL RESTRICTED
以確保它們只在領(lǐng)導(dǎo)者中執(zhí)行。
注意查詢規(guī)劃器不會(huì)為了獲取一個(gè)更好的計(jì)劃而考慮延遲計(jì)算并行受限的函數(shù)或者聚集。所以,如果一個(gè)被應(yīng)用到特定表的WHERE
子句是并行受限的,查詢規(guī)劃器就不會(huì)考慮對(duì)處于計(jì)劃并行部分的表執(zhí)行一次掃描。在一些情況中,可以(甚至效率更高)把對(duì)表的掃描包括在查詢的并行部分并且延遲對(duì)WHERE
子句的計(jì)算,這樣它會(huì)出現(xiàn)在Gather
節(jié)點(diǎn)之上。不過,規(guī)劃器不會(huì)這樣做。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: