PostgreSQL 并行查詢?nèi)绾喂ぷ?/h1>

2021-08-27 16:17 更新

當(dāng)優(yōu)化器判斷對(duì)于某一個(gè)特定的查詢,并行查詢是最快的執(zhí)行策略時(shí),優(yōu)化器將創(chuàng)建一個(gè)查詢計(jì)劃。該計(jì)劃包括一個(gè) Gather或者Gather Merge節(jié)點(diǎn)。下面是一個(gè)簡(jiǎn)單的例子:

EXPLAIN SELECT * FROM pgbench_accounts WHERE filler LIKE '%x%';
                                     QUERY PLAN                                      
-------------------------------------------------------------------?------------------
 Gather  (cost=1000.00..217018.43 rows=1 width=97)
   Workers Planned: 2
   ->  Parallel Seq Scan on pgbench_accounts  (cost=0.00..216018.33 rows=1 width=97)
         Filter: (filler ~~ '%x%'::text)
(4 rows)

在所有的情形下,GatherGather Merge節(jié)點(diǎn)都只有一個(gè)子計(jì)劃,它是將被并行執(zhí)行的計(jì)劃的一部分。如果GatherGather Merge節(jié)點(diǎn)位于計(jì)劃樹的最頂層,那么整個(gè)查詢將并行執(zhí)行。如果它位于計(jì)劃樹的其他位置,那么只有查詢中在它之下的那一部分會(huì)并行執(zhí)行。在上面的例子中,查詢只訪問了一個(gè)表,因此除 Gather節(jié)點(diǎn)本身之外只有一個(gè)計(jì)劃節(jié)點(diǎn)。因?yàn)樵撚?jì)劃節(jié)點(diǎn)是Gather節(jié)點(diǎn)的孩子節(jié)點(diǎn),所以它會(huì)并行執(zhí)行。

使用 EXPLAIN命令, 你能看到規(guī)劃器選擇的工作者數(shù)量。當(dāng)查詢執(zhí)行期間到達(dá)Gather節(jié)點(diǎn)時(shí),實(shí)現(xiàn)用戶會(huì)話的進(jìn)程將會(huì)請(qǐng)求和規(guī)劃器選中的工作者數(shù)量一樣多的后臺(tái)工作者進(jìn)程 。規(guī)劃器將考慮使用的后臺(tái)工作者的數(shù)量被限制為最多 max_parallel_workers_per_gather個(gè)。任何時(shí)候能夠存在的后臺(tái)工作者進(jìn)程的總數(shù)由max_worker_processesmax_parallel_workers限制。因此,一個(gè)并行查詢可能會(huì)使用比規(guī)劃中少的工作者來運(yùn)行,甚至有可能根本不使用工作者。最優(yōu)的計(jì)劃可能取決于可用的工作者的數(shù)量,因此這可能會(huì)導(dǎo)致不好的查詢性能。如果這種情況經(jīng)常發(fā)生,那么就應(yīng)當(dāng)考慮一下提高 max_worker_processesmax_parallel_workers的值,這樣更多的工作者可以同時(shí)運(yùn)行;或者降低max_parallel_workers_per_gather,這樣規(guī)劃器會(huì)要求少一些的工作者。

為一個(gè)給定并行查詢成功啟動(dòng)的后臺(tái)工作者進(jìn)程都將會(huì)執(zhí)行計(jì)劃的并行部分。這些工作者的領(lǐng)導(dǎo)者也將執(zhí)行該計(jì)劃,不過它還有一個(gè)額外的任務(wù):它還必須讀取所有由工作者產(chǎn)生的元組。當(dāng)整個(gè)計(jì)劃的并行部分只產(chǎn)生了少量元組時(shí),領(lǐng)導(dǎo)者通常將表現(xiàn)為一個(gè)額外的加速查詢執(zhí)行的工作者。反過來,當(dāng)計(jì)劃的并行部分產(chǎn)生大量的元組時(shí),領(lǐng)導(dǎo)者將幾乎全用來讀取由工作者產(chǎn)生的元組并且執(zhí)行GatherGather Merge節(jié)點(diǎn)上層計(jì)劃節(jié)點(diǎn)所要求的任何進(jìn)一步處理。在這些情況下,領(lǐng)導(dǎo)者所作的執(zhí)行并行部分的工作將會(huì)很少。

當(dāng)計(jì)劃的并行部分的頂層節(jié)點(diǎn)是Gather Merge而不是Gather時(shí),它表示每個(gè)執(zhí)行計(jì)劃并行部分的進(jìn)程會(huì)產(chǎn)生有序的元組,并且領(lǐng)導(dǎo)者執(zhí)行一種保持順序的合并。相反,Gather會(huì)以任何方便的順序從工作者讀取元組,這會(huì)破壞可能已經(jīng)存在的排序順序。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)