Postgresql
在 Postgresql 中將並行化選擇查詢的結果插入表中
根據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 中?