Postgresql

在 Postgresql 中將並行化選擇查詢的結果插入表中

  • September 26, 2018

根據https://www.postgresql.org/docs/current/static/when-can-parallel-query-be-used.html

“即使通常可以生成並行查詢計劃,如果以下任何一項為真,規劃器也不會為給定查詢生成它們:查詢寫入任何數據或鎖定任何數據庫行。如果查詢包含“無論是在頂層還是在 CTE 中的數據修改操作,都不會為該查詢生成並行計劃。這是目前實現的一個限制,可以在未來的版本中取消。”

實際上,當我嘗試將並行 SELECT 查詢的結果插入表中時(通過 SELECT..INTO 或 WITH..SELECT..INTO,查詢不會作為並行查詢執行。

我的問題是:有什麼方法可以欺騙 Postgresql,以便將 SELECT 查詢作為並行查詢執行,然後將其結果插入表中?

我認為唯一值得嘗試的是使用PostgreSQL FDW,它可能有效,也可能無效。您的案例還必須是超級利基才能獲得回報,例如復雜的 GIS 聚合查詢。

你可以看到這個限制在程式碼中還是很明顯的,

並行模式施加的最大限制是所有操作都必須是嚴格只讀的;我們不允許寫入數據庫,也不允許 DDL。我們將來可能會嘗試放寬這些限制。

而且,再次在這裡

* Don't allow writes in parallel mode.  Supporting UPDATE and DELETE
* would require (a) storing the combocid hash in shared memory, rather
* than synchronizing it just once at the start of parallelism, and (b) an
* alternative to heap_update()'s reliance on xmax for mutual exclusion.
* INSERT may have no such troubles, but we forbid it to simplify the
* checks.

我認為它被一個電話ExecCheckXactReadOnly打斷了ExecCheckXactReadOnly

if (plannedstmt->commandType != CMD_SELECT || plannedstmt->hasModifyingCTE)
   PreventCommandIfParallelMode(CreateCommandTag((Node *) plannedstmt));

也許在 PostgreSQL 11 或 12 中?

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